respect exif image orientation in previews
parent
a477468272
commit
1b823bcce4
|
@ -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"]
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue