From 413aa04dcaf8bff3935ed1e5f31432e11a03ce6f Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Sun, 25 Jan 2026 22:36:31 +0000 Subject: [PATCH] fix: thumbnailification requires rgb8/rgba8 (#505) --- .../files/src/implementation/media_impl.rs | 22 ++++++++++++++++++ crates/core/files/tests/assets/test-float.png | Bin 0 -> 6063 bytes 2 files changed, 22 insertions(+) create mode 100644 crates/core/files/tests/assets/test-float.png diff --git a/crates/core/files/src/implementation/media_impl.rs b/crates/core/files/src/implementation/media_impl.rs index bd39534a..0f13be1c 100644 --- a/crates/core/files/src/implementation/media_impl.rs +++ b/crates/core/files/src/implementation/media_impl.rs @@ -132,6 +132,17 @@ impl MediaRepository for MediaImpl { let [w, h] = self.config.preview.get(tag).unwrap(); let image = image.thumbnail(image.width().min(*w as u32), image.height().min(*h as u32)); + let image = match image { + DynamicImage::ImageRgb8(_) => image, + DynamicImage::ImageRgba8(_) => image, + _ => { + if image.has_alpha() { + image.to_rgba8().into() + } else { + image.to_rgb8().into() + } + } + }; let encoder = webp::Encoder::from_image(&image).expect("Could not create encoder."); if self.config.webp_quality != 100.0 { @@ -216,6 +227,17 @@ mod tests { media.create_thumbnail(image, "emojis"); } + #[tokio::test] + async fn asset_test_floating_point_png() { + let media = MediaImpl::from_config().await; + let buf = include_bytes!("../../tests/assets/test-float.png"); + assert_eq!(media.image_size_vec(buf, "image/png"), Some((300, 300))); + + let mut reader = Cursor::new(buf); + let image = media.decode_image(&mut reader, "image/png").unwrap(); + media.create_thumbnail(image, "avatars"); + } + #[tokio::test] async fn asset_test_corrupted_png() { let media = MediaImpl::from_config().await; diff --git a/crates/core/files/tests/assets/test-float.png b/crates/core/files/tests/assets/test-float.png new file mode 100644 index 0000000000000000000000000000000000000000..036e9d4d4782b01b5ee734133460e11339673d41 GIT binary patch literal 6063 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