lenna_core 0.1.7

Lenna is a library for image processing algorithms and apps.
Documentation
use crate::core::LennaImage;

use exif::{Field, Reader as ExifReader};
use std::io::Read;

pub fn read_from_file(path: String) -> Result<LennaImage, Box<dyn std::error::Error>> {
    let path = std::path::Path::new(&path);

    let mut file = std::fs::File::open(path)?;
    let mut data: Vec<u8> = Vec::new();
    file.read_to_end(&mut data).unwrap();
    let mut image = read_from_data(data).unwrap();
    image.name = path.file_stem().unwrap().to_str().unwrap().to_string();
    image.path = path.parent().unwrap().to_str().unwrap().to_string();
    Ok(image)
}

pub fn read_from_data(data: Vec<u8>) -> Result<LennaImage, Box<dyn std::error::Error>> {
    let img = image::load_from_memory(&data).unwrap();

    let mut c = std::io::Cursor::new(&data);
    let exif = match ExifReader::new().read_from_container(&mut c) {
        Ok(exif) => exif,
        Err(_) => ExifReader::new()
            .read_raw(b"MM\0\x2a\0\0\0\x08\0\0\0\0\0\0".to_vec())
            .unwrap(),
    };
    let mut exif_out: Vec<Field> = Vec::new();
    for f in exif.fields() {
        exif_out.push(f.clone());
    }

    Ok(LennaImage {
        name: "".to_string(),
        path: "".to_string(),
        image: Box::new(img),
        exif: Box::new(exif_out),
    })
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn read_file() {
        let image = read_from_file("lenna.png".into()).unwrap();
        assert_eq!(image.exif.len(), 0);
        assert_eq!(image.name, "lenna".to_string());
        assert_eq!(image.path, "".to_string());
    }
}