Encode WebP thumbnails at quality 80

This commit is contained in:
2026-07-22 18:33:20 +02:00
parent 70503c8bc2
commit bdfe57b66f
5 changed files with 31 additions and 9 deletions

View File

@@ -19,6 +19,7 @@ unicode-normalization = { workspace = true }
thiserror = { workspace = true }
walkdir = { workspace = true }
image = { workspace = true }
webp = { workspace = true }
rust-stemmers = { workspace = true }
sys-locale = { workspace = true }
fluent-bundle = { workspace = true }

View File

@@ -1,5 +1,5 @@
use image::imageops::FilterType;
use image::{DynamicImage, GenericImageView, ImageFormat, ImageReader};
use image::{DynamicImage, GenericImageView, ImageReader};
use std::fs;
use std::io::Cursor;
use std::path::Path;
@@ -101,13 +101,11 @@ pub fn generate_thumbnail(
match size.format {
ThumbnailFormat::Webp => {
// Encode as WebP via image crate
let mut buf = Cursor::new(Vec::new());
resized
.write_to(&mut buf, ImageFormat::WebP)
.map_err(|e| format!("WebP encode: {e}"))?;
let _ = quality; // image crate WebP encoder doesn't expose quality directly
fs::write(dest, buf.into_inner()).map_err(|e| format!("write: {e}"))?;
let rgba = resized.to_rgba8();
let encoded = webp::Encoder::from_rgba(rgba.as_raw(), rgba.width(), rgba.height())
.encode_simple(false, f32::from(quality))
.map_err(|e| format!("WebP encode: {e:?}"))?;
fs::write(dest, &*encoded).map_err(|e| format!("write: {e}"))?;
}
ThumbnailFormat::Jpeg => {
let rgb = resized.to_rgb8();
@@ -325,6 +323,8 @@ mod tests {
// 100x80 is smaller than 150 wide, no enlargement
assert_eq!(w, 100);
assert_eq!(h, 80);
let encoded = fs::read(&dest).unwrap();
assert_eq!(&encoded[12..16], b"VP8 ", "thumbnail must use lossy WebP");
}
#[test]