fix: use exif oreintation

https://alexwlchan.net/2025/create-thumbnail-is-exif-aware/
This commit is contained in:
electria 2026-07-02 15:14:10 -07:00
commit 831def32a4
Signed by: electria
SSH key fingerprint: SHA256:8LlB3ucPbBHqozqkhsNbaV5oG3SlzzqUj8FZDL6IPQs

View file

@ -5,7 +5,10 @@ use iced::{
keyboard::{self, Key, key}, keyboard::{self, Key, key},
theme, widget, window, theme, widget, window,
}; };
use image::{EncodableLayout, ImageReader, RgbaImage, codecs::webp::WebPEncoder, imageops}; use image::{
DynamicImage, EncodableLayout, ImageDecoder, ImageReader, RgbaImage, codecs::webp::WebPEncoder,
imageops,
};
use rfd::FileDialog; use rfd::FileDialog;
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
@ -124,7 +127,27 @@ impl State {
} }
}; };
let decoded_image = match reader.decode() { let mut decoder = match reader.into_decoder() {
Ok(d) => d,
Err(e) => {
return Some(format!(
"failed to create decoder for '{}': {e}",
path.as_ref().display()
));
}
};
let oreintation = match decoder.orientation() {
Ok(o) => o,
Err(e) => {
return Some(format!(
"failed to get oreintation of '{}': {e}",
path.as_ref().display()
));
}
};
let mut decoded_image = match DynamicImage::from_decoder(decoder) {
Ok(i) => i, Ok(i) => i,
Err(e) => { Err(e) => {
return Some(format!( return Some(format!(
@ -134,6 +157,8 @@ impl State {
} }
}; };
decoded_image.apply_orientation(oreintation);
self.image = Some(decoded_image.into_rgba8()); self.image = Some(decoded_image.into_rgba8());
None None