Read EXIF in JPEG for resize

This commit is contained in:
Matteo Paonessa 2024-08-10 17:56:40 +02:00
parent 2114a02fcb
commit f9aab1ef78
4 changed files with 34 additions and 23 deletions

View File

@ -1,6 +1,6 @@
[package]
name = "libcaesium"
version = "0.16.3"
version = "0.16.4"
authors = ["Matteo Paonessa <matteo.paonessa@gmail.com>"]
edition = "2021"
categories = ["multimedia::images"]

View File

@ -7,7 +7,7 @@ use img_parts::{DynImage, ImageEXIF, ImageICC};
use crate::{compress_in_memory, CSParameters, SupportedFileTypes};
use crate::error::CaesiumError;
use crate::utils::get_filetype_from_memory;
use crate::utils::{get_filetype_from_memory, get_jpeg_orientation};
pub fn convert_in_memory(in_file: Vec<u8>, format: SupportedFileTypes, parameters: &CSParameters) -> Result<Vec<u8>, CaesiumError> {
let mut iccp = None;
@ -127,21 +127,4 @@ fn map_image_format(format: SupportedFileTypes) -> Result<ImageFormat, CaesiumEr
};
Ok(image_format)
}
fn get_jpeg_orientation(data: &[u8]) -> u32 {
let reader = exif::Reader::new();
let mut cursor = Cursor::new(data);
let exif_data = match reader.read_from_container(&mut cursor) {
Ok(v) => v,
Err(_) => return 1
};
let exif_field = match exif_data.get_field(exif::Tag::Orientation, exif::In::PRIMARY) {
Some(value) => value,
None => return 1,
};
exif_field.value.get_uint(0).unwrap_or(1)
}
}

View File

@ -1,10 +1,11 @@
use std::io::Cursor;
use image::DynamicImage;
use image::imageops::FilterType;
use image::io::Reader as ImageReader;
use image::DynamicImage;
use crate::error::CaesiumError;
use crate::utils::get_jpeg_orientation;
pub fn resize(
image_buffer: Vec<u8>,
@ -12,7 +13,15 @@ pub fn resize(
height: u32,
format: image::ImageFormat,
) -> Result<Vec<u8>, CaesiumError> {
let mut image = ImageReader::new(Cursor::new(image_buffer))
let buffer_slice = image_buffer.as_slice();
let (mut desired_width, mut desired_height) = (width, height);
if format == image::ImageFormat::Jpeg {
let orientation = get_jpeg_orientation(buffer_slice);
(desired_width, desired_height) = match orientation {
5..=8 => (height, width),
_ => (width, height)
};
}let mut image = ImageReader::new(Cursor::new(image_buffer))
.with_guessed_format()
.map_err(|e| CaesiumError {
message: e.to_string(),
@ -24,7 +33,7 @@ pub fn resize(
code: 10301,
})?;
let dimensions = compute_dimensions(image.width(), image.height(), width, height);
let dimensions = compute_dimensions(image.width(), image.height(), desired_width, desired_height);
image = image.resize_exact(dimensions.0, dimensions.1, FilterType::Lanczos3);
let mut resized_file: Vec<u8> = vec![];

View File

@ -1,3 +1,4 @@
use std::io::Cursor;
use infer::Type;
use crate::SupportedFileTypes;
@ -18,6 +19,24 @@ pub fn get_filetype_from_memory(buf: &[u8]) -> SupportedFileTypes {
}
}
pub fn get_jpeg_orientation(data: &[u8]) -> u32 {
let reader = exif::Reader::new();
let mut cursor = Cursor::new(data);
let exif_data = match reader.read_from_container(&mut cursor) {
Ok(v) => v,
Err(_) => return 1
};
let exif_field = match exif_data.get_field(exif::Tag::Orientation, exif::In::PRIMARY) {
Some(value) => value,
None => return 1,
};
exif_field.value.get_uint(0).unwrap_or(1)
}
fn match_supported_filetypes(ft: Type) -> SupportedFileTypes {
match ft.mime_type() {
"image/jpeg" => SupportedFileTypes::Jpeg,