diff --git a/Cargo.toml b/Cargo.toml index ee4e3a2..232f50e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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"] diff --git a/src/previews/image.rs b/src/previews/image.rs index 1772cbb..b554f41 100644 --- a/src/previews/image.rs +++ b/src/previews/image.rs @@ -14,7 +14,28 @@ impl<'a> Previewable for ImagePath<'a> { fn get_thumbnail(&self) -> Result>> { #[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);