diff --git a/src/filters/markdown.rs b/src/filters/markdown.rs index d699ddb..a32cb5c 100644 --- a/src/filters/markdown.rs +++ b/src/filters/markdown.rs @@ -1,7 +1,7 @@ use core::fmt; use std::path::Path; -use image::{image_dimensions, ImageReader}; +use image::image_dimensions; use indoc::formatdoc; use pulldown_cmark::{CodeBlockKind, Event, Options, Parser, Tag, TagEnd}; use syntect::{highlighting::ThemeSet, html::highlighted_html_for_string, parsing::SyntaxSet}; diff --git a/src/picture_generator/export_format.rs b/src/picture_generator/export_format.rs index 4d0856e..809ba90 100644 --- a/src/picture_generator/export_format.rs +++ b/src/picture_generator/export_format.rs @@ -1,5 +1,4 @@ -use image::ImageFormat; - +#[allow(dead_code)] #[derive(Debug, PartialEq, Clone, Copy)] pub enum ExportFormat { Jpeg, @@ -25,12 +24,4 @@ impl ExportFormat { ExportFormat::Png => "image/png", } } - pub fn get_image_format(&self) -> ImageFormat { - match self { - ExportFormat::Jpeg => ImageFormat::Jpeg, - ExportFormat::Avif => ImageFormat::Avif, - ExportFormat::Svg => ImageFormat::Jpeg, // TODO what now? - ExportFormat::Png => ImageFormat::Png, - } - } } diff --git a/src/picture_generator/image_generator.rs b/src/picture_generator/image_generator.rs index 7f2b1e7..09fb56c 100644 --- a/src/picture_generator/image_generator.rs +++ b/src/picture_generator/image_generator.rs @@ -1,6 +1,14 @@ -use std::{fs::create_dir_all, path::Path}; +use std::{ + fs::{create_dir_all, File}, + io::BufWriter, + path::Path, +}; -use image::{imageops::FilterType, DynamicImage}; +use image::{ + codecs::{jpeg::JpegEncoder, png::PngEncoder}, + imageops::FilterType, + DynamicImage, +}; use rayon::iter::{IntoParallelRefIterator, ParallelIterator}; use tracing::{debug, error}; @@ -33,8 +41,26 @@ pub fn generate_images( create_dir_all(parent_dir).unwrap(); } - let result = resized.save_with_format(&save_path, format.get_image_format()); - match result { + let encode = { + let buffered_file_write = &mut BufWriter::new(File::create(&save_path).unwrap()); // always seekable + match format { + ExportFormat::Jpeg => { + let encoder = JpegEncoder::new_with_quality(buffered_file_write, 87); + resized.write_with_encoder(encoder) + } + ExportFormat::Avif => todo!(), + ExportFormat::Svg => todo!(), + ExportFormat::Png => { + let encoder = PngEncoder::new_with_quality( + buffered_file_write, + image::codecs::png::CompressionType::Best, + image::codecs::png::FilterType::Adaptive, + ); + resized.write_with_encoder(encoder) + } + } + }; + match encode { Err(err) => { error!("Failed to generate {:?} - {:?}", &save_path, err); }