Using mozjpeg for jpeg image converisons.

New export image naming format
This commit is contained in:
Piyush मिश्रः 2022-03-26 01:11:16 +05:30
parent fadf6e68e1
commit 2db68a3dc1
4 changed files with 128 additions and 18 deletions

86
Cargo.lock generated
View File

@ -20,6 +20,17 @@ version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234"
[[package]]
name = "ahash"
version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"
dependencies = [
"getrandom 0.2.3",
"once_cell",
"version_check",
]
[[package]] [[package]]
name = "aho-corasick" name = "aho-corasick"
version = "0.7.18" version = "0.7.18"
@ -38,6 +49,12 @@ dependencies = [
"num-traits", "num-traits",
] ]
[[package]]
name = "arrayvec"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6"
[[package]] [[package]]
name = "atty" name = "atty"
version = "0.2.14" version = "0.2.14"
@ -283,6 +300,12 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "dunce"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "453440c271cf5577fd2a40e4942540cb7d0d2f85e27c8d07dd0023c925a67541"
[[package]] [[package]]
name = "either" name = "either"
version = "1.6.1" version = "1.6.1"
@ -305,6 +328,15 @@ dependencies = [
"threadpool", "threadpool",
] ]
[[package]]
name = "fallible_collections"
version = "0.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "52db5973b6a19247baf19b30f41c23a1bfffc2e9ce0a5db2f60e3cd5dc8895f7"
dependencies = [
"hashbrown",
]
[[package]] [[package]]
name = "flate2" name = "flate2"
version = "1.0.22" version = "1.0.22"
@ -420,6 +452,9 @@ name = "hashbrown"
version = "0.11.2" version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
dependencies = [
"ahash",
]
[[package]] [[package]]
name = "heck" name = "heck"
@ -563,9 +598,9 @@ checksum = "7efd1d698db0759e6ef11a7cd44407407399a910c774dd804c64c032da7826ff"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.112" version = "0.2.121"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b03d17f364a3a042d5e5d46b053bbbf82c92c9430c592dd4c064dc6ee997125" checksum = "efaa7b300f3b5fe8eb6bf21ce3895e1751d9665086af2d64b42f19701015ff4f"
[[package]] [[package]]
name = "libwebp-sys" name = "libwebp-sys"
@ -637,6 +672,31 @@ dependencies = [
"adler", "adler",
] ]
[[package]]
name = "mozjpeg"
version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75fce8c02d82d7dc473d6c156c52cc9f161e9eef0bca5145d87ad6c62a20ac3f"
dependencies = [
"arrayvec",
"fallible_collections",
"libc",
"mozjpeg-sys",
"rgb",
]
[[package]]
name = "mozjpeg-sys"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "215a592d91abceb187028dfc6d9c07811bdfc5584d4ada50a4d387d82ed0aedc"
dependencies = [
"cc",
"dunce",
"libc",
"nasm-rs",
]
[[package]] [[package]]
name = "nalgebra" name = "nalgebra"
version = "0.30.1" version = "0.30.1"
@ -661,6 +721,12 @@ dependencies = [
"getrandom 0.2.3", "getrandom 0.2.3",
] ]
[[package]]
name = "nasm-rs"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ce095842aee9aa3ecbda7a5d2a4df680375fd128a8596b6b56f8e497e231f483"
[[package]] [[package]]
name = "num" name = "num"
version = "0.4.0" version = "0.4.0"
@ -747,6 +813,12 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "once_cell"
version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9"
[[package]] [[package]]
name = "os_str_bytes" name = "os_str_bytes"
version = "6.0.0" version = "6.0.0"
@ -816,6 +888,7 @@ dependencies = [
"infer", "infer",
"lazy_static", "lazy_static",
"log", "log",
"mozjpeg",
"rusttype", "rusttype",
"serde", "serde",
"serde_json", "serde_json",
@ -990,6 +1063,15 @@ version = "0.6.25"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b"
[[package]]
name = "rgb"
version = "0.8.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e74fdc210d8f24a7dbfedc13b04ba5764f5232754ccebfdf5fff1bad791ccbc6"
dependencies = [
"bytemuck",
]
[[package]] [[package]]
name = "rusttype" name = "rusttype"
version = "0.9.2" version = "0.9.2"

View File

@ -33,3 +33,4 @@ dirs = "4.0"
infer = "0.7.0" infer = "0.7.0"
textwrap = "0.14" textwrap = "0.14"
webbrowser = "0.5" webbrowser = "0.5"
mozjpeg = "0.9.2"

2
Cross.toml Normal file
View File

@ -0,0 +1,2 @@
[target.x86_64-pc-windows-gnu]
image = "rustembedded/cross:x86_64-pc-windows-gnu"

View File

@ -64,6 +64,13 @@ impl Into<(i32, i32)> for Coord {
} }
} }
impl Into<(usize, usize)> for Coord {
fn into(self) -> (usize, usize) {
(self.0 as usize, self.1 as usize)
}
}
#[derive(Serialize, Deserialize, Debug, Clone)] #[derive(Serialize, Deserialize, Debug, Clone)]
pub(crate) struct ImageInfo { pub(crate) struct ImageInfo {
pub(crate) path: PathBuf, pub(crate) path: PathBuf,
@ -217,14 +224,10 @@ impl ImageContainer {
}; };
let config = globals::CONFIG.read().unwrap(); let config = globals::CONFIG.read().unwrap();
let export_format = &config.image_format; let export_format = &config.image_format;
let export = path_original.parent().unwrap().join("export").join( let mut export = path_original.parent().unwrap().join("export")
path_original .join(format!("{}-{}", path_original.file_stem().unwrap_or_default().to_string_lossy(),
.with_extension(export_format.as_extension()) path_original.extension().unwrap_or_default().to_string_lossy()));
.file_name() export.set_extension(export_format.as_extension());
.unwrap()
.to_str()
.unwrap(),
);
let mut prop = prop.clone(); let mut prop = prop.clone();
prop.image_info = None; prop.image_info = None;
@ -276,11 +279,25 @@ impl ImageContainer {
encoder.write_image(&img.into_rgba8(), w, h, image::ColorType::Rgba8).warn_log("Failed to export Image!"); encoder.write_image(&img.into_rgba8(), w, h, image::ColorType::Rgba8).warn_log("Failed to export Image!");
} }
ImageType::Jpeg => { ImageType::Jpeg => {
let mut encoder = let (width, height) = Coord::from(img.dimensions()).into();
image::codecs::jpeg::JpegEncoder::new_with_quality(&mut output, 100); let buf = img.into_rgb8();
encoder.set_pixel_density(image::codecs::jpeg::PixelDensity::dpi(300));
encoder.encode_image(&img).warn_log("Failed to export Image!"); let mut comp = mozjpeg::Compress::new(mozjpeg::ColorSpace::JCS_RGB);
comp.set_size(width, height);
comp.set_quality(100.0);
comp.set_smoothing_factor(1);
comp.set_mem_dest();
comp.start_compress();
comp.write_scanlines(&buf);
comp.finish_compress();
match comp.data_to_vec() {
Ok(data) => std::fs::write(&export, data).warn_log("Failed to export Image!"),
Err(e) => Result::<(), _>::Err(e).warn_log("Failed to encode image!")
}
} }
_ => (), _ => (),
} }
@ -479,13 +496,21 @@ fn load_image(image_info: &ImageInfo) -> DynamicImage {
ImageType::Webp => { ImageType::Webp => {
let mut f = File::open(&image_info.path).expect_log("Failed to open image!"); let mut f = File::open(&image_info.path).expect_log("Failed to open image!");
let mut buf = vec![]; let mut buf = vec![];
f.read_to_end(&mut buf).unwrap(); f.read_to_end(&mut buf).expect_log("Failed to read image!");
let a = webp::Decoder::new(&buf).decode().unwrap(); let a = webp::Decoder::new(&buf).decode().ok_or("").expect_log("Failed to decode image!");
a.to_image() a.to_image()
} }
ImageType::Jpeg => { ImageType::Jpeg => {
let dec = image::codecs::jpeg::JpegDecoder::new(File::open(&image_info.path).expect_log("Failed to open image!")).expect_log("Failed to decode image!"); let mut f = File::open(&image_info.path).expect_log("Failed to open image!");
DynamicImage::from_decoder(dec).expect_log("Failed to open image!") let mut buf = vec![];
f.read_to_end(&mut buf).expect_log("Failed to read image!");
let d = mozjpeg::Decompress::with_markers(mozjpeg::ALL_MARKERS).from_mem(&buf)
.expect_log("Failed to decompress image!");
let mut image = d.rgb().expect_log("Failed to covert to rgb image!");
let pixels = image.read_scanlines_flat().unwrap();
let image = ImageBuffer::from_raw(image.width() as u32, image.height() as u32, pixels).unwrap();
DynamicImage::ImageRgb8(image)
} }
ImageType::Png => { ImageType::Png => {
let dec = image::codecs::png::PngDecoder::new(File::open(&image_info.path).expect_log("Failed to open image!")).expect_log("Failed to decode image!"); let dec = image::codecs::png::PngDecoder::new(File::open(&image_info.path).expect_log("Failed to open image!")).expect_log("Failed to decode image!");