imgforge 0.17.0

Fast and secure image proxy and transformation server
Documentation
use exif::{In, Tag};
use std::io::Cursor;

pub fn format_to_content_type(format: &str) -> &'static str {
    match format {
        "png" | "image/png" => "image/png",
        "webp" | "image/webp" => "image/webp",
        "gif" | "image/gif" => "image/gif",
        "tiff" | "image/tiff" => "image/tiff",
        "avif" | "image/avif" => "image/avif",
        "heif" | "image/heif" => "image/heif",
        "jpeg" | "jpg" | "image/jpeg" => "image/jpeg",
        _ => "image/jpeg",
    }
}

pub fn content_type_to_format(content_type: &str) -> Option<&'static str> {
    let mime = content_type.split(';').next()?.trim().to_ascii_lowercase();
    match mime.as_str() {
        "image/jpeg" => Some("jpeg"),
        "image/png" => Some("png"),
        "image/webp" => Some("webp"),
        "image/gif" => Some("gif"),
        "image/tiff" => Some("tiff"),
        "image/avif" => Some("avif"),
        "image/heif" | "image/heic" => Some("heif"),
        _ => None,
    }
}

pub fn read_exif_orientation(image_bytes: &[u8]) -> Option<u32> {
    let exif_reader = exif::Reader::new();
    exif_reader
        .read_from_container(&mut Cursor::new(image_bytes))
        .ok()
        .and_then(|exif| {
            exif.get_field(Tag::Orientation, In::PRIMARY)
                .and_then(|field| field.value.get_uint(0))
        })
}