From e7770e756a9878bad360805a36e83329b4990c1d Mon Sep 17 00:00:00 2001 From: Vladyslav Vladinov Date: Sat, 1 Jun 2024 14:11:05 +0200 Subject: [PATCH 1/5] feat(codecs): :bug: added write icc profile into encoders --- src/codecs/mozjpeg/encoder/mod.rs | 6 ++++++ src/codecs/oxipng/encoder/mod.rs | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/src/codecs/mozjpeg/encoder/mod.rs b/src/codecs/mozjpeg/encoder/mod.rs index aef6de85..3edd601f 100644 --- a/src/codecs/mozjpeg/encoder/mod.rs +++ b/src/codecs/mozjpeg/encoder/mod.rs @@ -177,6 +177,7 @@ impl EncoderTrait for MozJpegEncoder { { use exif::experimental::Writer; + // write exif data if let Some(metadata) = &image.metadata().exif() { let mut writer = Writer::new(); // write first tags for exif @@ -195,6 +196,11 @@ impl EncoderTrait for MozJpegEncoder { log::warn!("Writing exif failed {:?}", result); } } + + // write icc data + if let Some(metadata) = &image.metadata().icc_chunk() { + comp.write_icc_profile(&metadata); + } } comp.write_scanlines(data)?; diff --git a/src/codecs/oxipng/encoder/mod.rs b/src/codecs/oxipng/encoder/mod.rs index 354bbfc6..7b198c39 100644 --- a/src/codecs/oxipng/encoder/mod.rs +++ b/src/codecs/oxipng/encoder/mod.rs @@ -99,6 +99,7 @@ impl EncoderTrait for OxiPngEncoder { let mut buf = std::io::Cursor::new(vec![]); + // write exif data if let Some(fields) = &image.metadata().exif() { let mut writer = Writer::new(); @@ -112,6 +113,11 @@ impl EncoderTrait for OxiPngEncoder { log::warn!("Writing exif failed {:?}", result); } } + + // write icc data + if let Some(icc) = &image.metadata().icc_chunk() { + img.add_icc_profile(&icc); + } } let mut writer = ZWriter::new(sink); From b6da8d6d6349878500b0b36e3ffb84e92ac115f4 Mon Sep 17 00:00:00 2001 From: Vladyslav Vladinov Date: Sat, 1 Jun 2024 14:11:29 +0200 Subject: [PATCH 2/5] feat(cli): :sparkles: added --strip option --- src/cli/common.rs | 6 +++++- src/main.rs | 13 +++++++++++-- src/operations/icc/mod.rs | 4 +++- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/cli/common.rs b/src/cli/common.rs index edb3ae1a..31eb07d1 100644 --- a/src/cli/common.rs +++ b/src/cli/common.rs @@ -1,6 +1,6 @@ use std::path::PathBuf; -use clap::{arg, value_parser, Command}; +use clap::{arg, value_parser, ArgAction, Command}; use indoc::indoc; use super::{preprocessors::Preprocessors, utils::threads}; @@ -51,6 +51,10 @@ impl CommonArgs for Command { By default, the number of available threads is utilized."#}) .value_parser(value_parser!(u8).range(1..=threads::num_threads() as i64)), ) + .arg( + arg!(-x --strip "Strip metadata when encoding images (where supported)") + .action(ArgAction::SetTrue) + ) .preprocessors() } } diff --git a/src/main.rs b/src/main.rs index f3c7dcf4..cf1534cf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -30,6 +30,9 @@ macro_rules! handle_error { }; } +const SUPPORTS_EXIF: &[&'static str] = &["mozjpeg", "oxipng", "jpeg", "png"]; +const SUPPORTS_ICC: &[&'static str] = &["mozjpeg", "oxipng"]; + fn main() { pretty_env_logger::init(); @@ -71,6 +74,7 @@ fn main() { let recursive = matches.get_flag("recursive"); let backup = matches.get_flag("backup"); + let strip_metadata = matches.get_flag("strip"); let suffix = matches.get_one::("suffix").cloned(); @@ -82,8 +86,13 @@ fn main() { let mut available_encoder = handle_error!(input, encoder(subcommand, matches)); output.set_extension(available_encoder.to_extension()); - pipeline.chain_operations(Box::new(AutoOrient)); - pipeline.chain_operations(Box::new(ApplySRGB)); + if strip_metadata || !SUPPORTS_EXIF.contains(&subcommand) { + pipeline.chain_operations(Box::new(AutoOrient)); + } + + if strip_metadata || !SUPPORTS_ICC.contains(&subcommand) { + pipeline.chain_operations(Box::new(ApplySRGB)); + } operations(matches, &img) .into_iter() diff --git a/src/operations/icc/mod.rs b/src/operations/icc/mod.rs index a9927d23..77caa98e 100644 --- a/src/operations/icc/mod.rs +++ b/src/operations/icc/mod.rs @@ -119,7 +119,9 @@ impl OperationsTrait for ApplySRGB { return Ok(()); } - ApplyICC::new(Profile::new_srgb()).execute_impl(image) + ApplyICC::new(Profile::new_srgb()).execute_impl(image)?; + + Ok(()) } fn supported_types(&self) -> &'static [BitType] { From 73566cc327e4b48a479d4524074dc1b6e789a7f3 Mon Sep 17 00:00:00 2001 From: Vladyslav Vladinov Date: Sat, 30 Nov 2024 12:28:39 +0100 Subject: [PATCH 3/5] fix(cli): :bug: updated exif codecs support --- src/main.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 11b20272..ecbb26bf 100644 --- a/src/main.rs +++ b/src/main.rs @@ -42,7 +42,7 @@ macro_rules! handle_error { }; } -const SUPPORTS_EXIF: &[&'static str] = &["mozjpeg", "oxipng", "jpeg", "png"]; +const SUPPORTS_EXIF: &[&'static str] = &["mozjpeg", "oxipng"]; const SUPPORTS_ICC: &[&'static str] = &["mozjpeg", "oxipng"]; struct Result { @@ -177,6 +177,8 @@ fn main() { } }); + dbg!(img.metadata()); + pipeline.chain_decoder(img); handle_error!(input, pipeline.advance_to_end()); From b4094290a41f7e782dba2eca9b57a21a8010014a Mon Sep 17 00:00:00 2001 From: Vladyslav Vladinov Date: Sat, 30 Nov 2024 12:33:39 +0100 Subject: [PATCH 4/5] chore(codecs): :rotating_light: fixed linter warnings --- src/codecs/mozjpeg/encoder/mod.rs | 2 +- src/codecs/oxipng/encoder/mod.rs | 2 +- src/main.rs | 2 -- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/codecs/mozjpeg/encoder/mod.rs b/src/codecs/mozjpeg/encoder/mod.rs index 3edd601f..e7094eb9 100644 --- a/src/codecs/mozjpeg/encoder/mod.rs +++ b/src/codecs/mozjpeg/encoder/mod.rs @@ -199,7 +199,7 @@ impl EncoderTrait for MozJpegEncoder { // write icc data if let Some(metadata) = &image.metadata().icc_chunk() { - comp.write_icc_profile(&metadata); + comp.write_icc_profile(metadata); } } diff --git a/src/codecs/oxipng/encoder/mod.rs b/src/codecs/oxipng/encoder/mod.rs index 7b198c39..89426420 100644 --- a/src/codecs/oxipng/encoder/mod.rs +++ b/src/codecs/oxipng/encoder/mod.rs @@ -116,7 +116,7 @@ impl EncoderTrait for OxiPngEncoder { // write icc data if let Some(icc) = &image.metadata().icc_chunk() { - img.add_icc_profile(&icc); + img.add_icc_profile(icc); } } diff --git a/src/main.rs b/src/main.rs index ecbb26bf..0e0d34c0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -177,8 +177,6 @@ fn main() { } }); - dbg!(img.metadata()); - pipeline.chain_decoder(img); handle_error!(input, pipeline.advance_to_end()); From 53a71f8712c727b1d863d9bb89f61dffdda690a7 Mon Sep 17 00:00:00 2001 From: Vladyslav Vladinov Date: Mon, 2 Dec 2024 19:35:30 +0100 Subject: [PATCH 5/5] chore(cli): :rotating_light: fixed clippy issues --- src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.rs b/src/main.rs index 0e0d34c0..f5d284ce 100644 --- a/src/main.rs +++ b/src/main.rs @@ -42,8 +42,8 @@ macro_rules! handle_error { }; } -const SUPPORTS_EXIF: &[&'static str] = &["mozjpeg", "oxipng"]; -const SUPPORTS_ICC: &[&'static str] = &["mozjpeg", "oxipng"]; +const SUPPORTS_EXIF: &[&str] = &["mozjpeg", "oxipng"]; +const SUPPORTS_ICC: &[&str] = &["mozjpeg", "oxipng"]; struct Result { output: PathBuf,