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 00000000..036e9d4d Binary files /dev/null and b/crates/core/files/tests/assets/test-float.png differ