respect exif image orientation in previews

feat/vaults
Tomáš Mládek 2022-03-16 11:30:06 +01:00
parent a477468272
commit 1b823bcce4
No known key found for this signature in database
GPG Key ID: 65E225C8B3E2ED8A
2 changed files with 22 additions and 1 deletions

View File

@ -87,7 +87,7 @@ default = [
]
desktop = ["webbrowser", "opener", "is_executable"]
previews = []
previews-image = ["image", "webp"]
previews-image = ["image", "webp", "kamadak-exif"]
extractors-web = ["webpage"]
extractors-audio = ["id3"]
extractors-photo = ["kamadak-exif"]

View File

@ -14,7 +14,28 @@ impl<'a> Previewable for ImagePath<'a> {
fn get_thumbnail(&self) -> Result<Option<Vec<u8>>> {
#[cfg(feature = "previews-image")]
{
let file = std::fs::File::open(&self.0)?;
let mut bufreader = std::io::BufReader::new(&file);
let exifreader = exif::Reader::new();
let orientation = exifreader
.read_from_container(&mut bufreader)
.ok()
.and_then(|exif| {
exif.get_field(exif::Tag::Orientation, exif::In::PRIMARY)
.and_then(|f| match &f.value {
exif::Value::Short(shorts) => Some(shorts.clone()),
_ => None,
})
})
.and_then(|shorts| shorts.first().cloned());
let image = ImageReader::open(&self.0)?.decode()?;
let image = match orientation {
Some(3) => image.rotate180(),
Some(6) => image.rotate90(),
Some(8) => image.rotate270(),
_ => image
};
let (w, h) = image.dimensions();
if cmp::max(w, h) > 1024 {
let thumbnail = image.thumbnail(1024, 1024);