From 1ab21307d631e7caf701e5b99a95a26f32ffbb97 Mon Sep 17 00:00:00 2001 From: lashman Date: Fri, 6 Mar 2026 16:53:32 +0200 Subject: [PATCH] Apply output DPI to JPEG files via mozjpeg pixel density - Add output_dpi field to EncoderOptions - Set JFIF pixel density header in JPEG output when DPI > 0 - Wire output_dpi from ProcessingJob through to encoder in both parallel and sequential execution paths --- pixstrip-core/src/encoder.rs | 10 ++++++++++ pixstrip-core/src/executor.rs | 2 ++ 2 files changed, 12 insertions(+) diff --git a/pixstrip-core/src/encoder.rs b/pixstrip-core/src/encoder.rs index acd1cbf..e354b00 100644 --- a/pixstrip-core/src/encoder.rs +++ b/pixstrip-core/src/encoder.rs @@ -8,6 +8,8 @@ use crate::types::{ImageFormat, QualityPreset}; pub struct EncoderOptions { pub progressive_jpeg: bool, pub avif_speed: u8, + /// Output DPI (0 means don't set / use default) + pub output_dpi: u32, } pub struct OutputEncoder { @@ -20,6 +22,7 @@ impl OutputEncoder { options: EncoderOptions { progressive_jpeg: false, avif_speed: 6, + output_dpi: 0, }, } } @@ -80,6 +83,13 @@ impl OutputEncoder { if self.options.progressive_jpeg { comp.set_progressive_mode(); } + if self.options.output_dpi > 0 { + comp.set_pixel_density(mozjpeg::PixelDensity { + unit: mozjpeg::PixelDensityUnit::Inches, + x: self.options.output_dpi as u16, + y: self.options.output_dpi as u16, + }); + } let mut output = Vec::new(); let mut started = comp.start_compress(&mut output).map_err(|e| PixstripError::Processing { diff --git a/pixstrip-core/src/executor.rs b/pixstrip-core/src/executor.rs index 7c556c3..c476eef 100644 --- a/pixstrip-core/src/executor.rs +++ b/pixstrip-core/src/executor.rs @@ -185,6 +185,7 @@ impl PipelineExecutor { let encoder = OutputEncoder::with_options(EncoderOptions { progressive_jpeg: job.progressive_jpeg, avif_speed: job.avif_speed, + output_dpi: job.output_dpi, }); match Self::process_single_static(job, source, &loader, &encoder, idx) { @@ -243,6 +244,7 @@ impl PipelineExecutor { let encoder = OutputEncoder::with_options(EncoderOptions { progressive_jpeg: job.progressive_jpeg, avif_speed: job.avif_speed, + output_dpi: job.output_dpi, }); let mut result = BatchResult {