From eee774f93cd733bf020bac93b95f38b548b3b48b Mon Sep 17 00:00:00 2001 From: Matteo Paonessa Date: Thu, 25 Jan 2024 19:02:48 +0100 Subject: [PATCH] Don't panic with EXIF, resize and corrupted JPEG --- src/jpeg.rs | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/src/jpeg.rs b/src/jpeg.rs index 5892410..a21e9dc 100644 --- a/src/jpeg.rs +++ b/src/jpeg.rs @@ -5,7 +5,8 @@ use std::panic::catch_unwind; use std::{fs, ptr}; use image::ImageOutputFormat::Jpeg; -use img_parts::{DynImage, ImageEXIF, ImageICC}; +use img_parts::jpeg::Jpeg as PartsJpeg; +use img_parts::{ImageEXIF, ImageICC}; use libc::free; use mozjpeg_sys::*; @@ -236,13 +237,10 @@ unsafe fn lossy(in_file: Vec, parameters: &CSParameters) -> Result, } fn extract_metadata(image: Vec) -> (Option, Option) { - let (iccp, exif) = DynImage::from_bytes(image.into()) - .expect("image loaded") - .map_or((None, None), |dyn_image| { - (dyn_image.icc_profile(), dyn_image.exif()) - }); - - (iccp, exif) + match PartsJpeg::from_bytes(image.into()) { + Ok(d) => (d.icc_profile(), d.exif()), + Err(_) => (None, None), + } } //TODO if image is resized, change "PixelXDimension" and "PixelYDimension" @@ -252,14 +250,11 @@ fn save_metadata( exif: Option, ) -> Vec { if iccp.is_some() || exif.is_some() { - let mut dyn_image = match DynImage::from_bytes(img_parts::Bytes::from(image_buffer.clone())) - { - Ok(o) => match o { - None => return image_buffer, - Some(d) => d, - }, - Err(_) => return image_buffer, - }; + let mut dyn_image = + match PartsJpeg::from_bytes(img_parts::Bytes::from(image_buffer.clone())) { + Ok(d) => d, + Err(_) => return image_buffer, + }; dyn_image.set_icc_profile(iccp); dyn_image.set_exif(exif);