From e2671cb15e84962dc2e92e29911b6066a067fc05 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Sat, 31 May 2025 00:27:38 -0700 Subject: fix(gif): Encode frames with accurate frame-delay --- src/main.rs | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/main.rs b/src/main.rs index 56583f1..e880989 100644 --- a/src/main.rs +++ b/src/main.rs @@ -80,23 +80,26 @@ fn main() { match index.as_str() { "gif" => { - let frame_duration = (1.0 / parser.get_framerate()) * 100.0; + #[allow(clippy::cast_sign_loss, clippy::cast_possible_truncation)] + let frame_delay = ((1.0 / parser.get_framerate()) * 100.0) as u16; let frames = (0..parser.get_frame_count()) .map(|i| get_image(&mut parser, i as usize)) .collect::>(); let mut file_out = std::fs::File::create(out_path).unwrap(); - let mut gif_encoder = image::codecs::gif::GifEncoder::new_with_speed( - &mut file_out, - #[allow(clippy::cast_possible_truncation)] - { - frame_duration as i32 - }, - ); + let mut gif_encoder = image::codecs::gif::GifEncoder::new(&mut file_out); + for frame in frames { - gif_encoder - .encode_frame(image::Frame::new(frame.into_rgba8())) - .unwrap(); + let rgba_frame = frame.into_rgba8(); + let gif_frame = image::Frame::from_parts( + rgba_frame, + 0, + 0, + image::Delay::from_numer_denom_ms(u32::from(frame_delay) * 10, 1), + ); + + gif_encoder.encode_frame(gif_frame).unwrap(); } + gif_encoder.set_repeat(image::codecs::gif::Repeat::Infinite).unwrap(); } "thumb" => { -- cgit v1.2.3