From 04f03b4efc243062b00c4c63ace3e529f9a27746 Mon Sep 17 00:00:00 2001 From: Marc Plano-Lesay Date: Fri, 11 Oct 2024 16:04:27 +1100 Subject: [PATCH] Decode images in parallel --- src/main.rs | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/src/main.rs b/src/main.rs index 53c30ec..fbaec9d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,5 @@ use clap::{Parser, ValueHint}; +use image::DynamicImage; use log::info; use pdf_writer::{Content, Filter, Finish, Name, Pdf, Rect, Ref}; use rayon::prelude::*; @@ -56,20 +57,37 @@ struct ImageFile { pub data: Vec, } +struct DecodedImageFile { + pub name: String, + pub data: Vec, + pub image: DynamicImage, +} + +impl From<&ImageFile> for DecodedImageFile { + fn from(value: &ImageFile) -> Self { + let image = image::load_from_memory(&value.data).unwrap(); + Self { + name: value.name.clone(), + data: value.data.clone(), + image, + } + } +} + fn convert_cbz(cbz_path: &Path, output_dir: &Path) -> Result<(), Box> { info!("Converting {:?}", cbz_path); let a4 = Rect::new(0.0, 0.0, 595.0, 842.0); let mut zip = ZipArchive::new(File::open(cbz_path)?)?; - let mut images = Vec::new(); + let mut files = Vec::new(); for i in 0..zip.len() { let mut file = zip.by_index(i)?; let mut image_data = Vec::new(); let name = file.enclosed_name().expect("Failed to read file name"); if name.extension() == Some(OsStr::new("jpg")) { file.read_to_end(&mut image_data)?; - images.push(ImageFile { + files.push(ImageFile { name: name .file_name() .expect("Failed to read file name") @@ -80,6 +98,11 @@ fn convert_cbz(cbz_path: &Path, output_dir: &Path) -> Result<(), Box Result<(), Box Result<(), Box