diff options
Diffstat (limited to 'dichroism/src/image_service.rs')
-rw-r--r-- | dichroism/src/image_service.rs | 76 |
1 files changed, 0 insertions, 76 deletions
diff --git a/dichroism/src/image_service.rs b/dichroism/src/image_service.rs deleted file mode 100644 index 0d2ed14..0000000 --- a/dichroism/src/image_service.rs +++ /dev/null @@ -1,76 +0,0 @@ -use crate::config::CONFIG_INSTANCE; -use crate::constants::{PHOTO_BASE_XY, PHOTO_FULLSIZE_XY, PHOTO_THUMBNAIL_XY}; -use crate::error::DichroismError; -use crate::models::{Photo, PhotoSet}; -use exif::Reader; -use image::imageops::FilterType; -use image::DynamicImage; -use image::GenericImageView; -use std::io::{BufReader, Cursor}; -use std::path::PathBuf; -use uuid::Uuid; - -pub fn generate_photo_set(data: Vec<u8>) -> Result<PhotoSet, DichroismError> { - // load image data from bytes - let mut original = image::load_from_memory(&data)?; - - // read EXIF tags to check for required rotation - let exifreader = Reader::new(); - let mut reader = BufReader::new(Cursor::new(data)); - let exif = exifreader.read_from_container(&mut reader).unwrap(); - if let Some(orient) = exif - .get_field(exif::Tag::Orientation, exif::In::PRIMARY) - .map(|o| o.value.get_uint(0)) - .flatten() - { - // if a tag was present, rotate original image data as necessary - match orient { - 8 => original = original.rotate270(), - 3 => original = original.rotate180(), - 6 => original = original.rotate90(), - _ => {} - } - } - - let fullsize = original.resize(PHOTO_FULLSIZE_XY, PHOTO_FULLSIZE_XY, FilterType::Lanczos3); - let base = original.resize(PHOTO_BASE_XY, PHOTO_BASE_XY, FilterType::Lanczos3); - - let (width, height) = original.dimensions(); - let thumbnail = if width > height { - let offset = (width - height) / 2; - original.crop_imm(offset, 0, width - offset * 2, height) - } else { - let offset = (height - width) / 2; - original.crop_imm(0, offset, width, height - offset * 2) - } - .resize(PHOTO_THUMBNAIL_XY, PHOTO_THUMBNAIL_XY, FilterType::Lanczos3); - - Ok(PhotoSet { - id: None, - original: generate_photo(&original)?, - fullsize: generate_photo(&fullsize)?, - base: generate_photo(&base)?, - thumbnail: generate_photo(&thumbnail)?, - }) -} - -fn generate_photo(image: &DynamicImage) -> Result<Photo, DichroismError> { - let base_name = Uuid::new_v3(&Uuid::NAMESPACE_OID, &image.to_bytes()) - .to_hyphenated() - .to_string(); - let mut path = PathBuf::from(&CONFIG_INSTANCE.img_root); - path.push(base_name); - path.set_extension("jpg"); - image.save(&path)?; - - let id = path - .file_name() - .ok_or_else(|| { - DichroismError::ImageWrite("Error extracting filename from path".to_string()) - })? - .to_str() - .ok_or_else(|| { - DichroismError::ImageWrite("Error converting filename to slice".to_string()) - })?; - Ok(Photo::new(String::from(id))) -} |