Save thumbnails as jpeg

This commit is contained in:
Antoine Gersant 2018-10-07 18:52:58 -07:00
parent f905bc4f73
commit 120ee72e1d

View file

@ -1,11 +1,13 @@
use image; use image;
use image::DynamicImage;
use image::FilterType; use image::FilterType;
use image::GenericImage; use image::GenericImage;
use image::GenericImageView; use image::GenericImageView;
use image::ImageBuffer; use image::ImageBuffer;
use image::ImageOutputFormat;
use std::cmp; use std::cmp;
use std::collections::hash_map::DefaultHasher; use std::collections::hash_map::DefaultHasher;
use std::fs::DirBuilder; use std::fs::{DirBuilder, File};
use std::hash::{Hash, Hasher}; use std::hash::{Hash, Hasher};
use std::path::*; use std::path::*;
@ -32,30 +34,42 @@ pub fn get_thumbnail(real_path: &Path, max_dimension: u32) -> Result<PathBuf> {
let source_image = image::open(real_path)?; let source_image = image::open(real_path)?;
let (source_width, source_height) = source_image.dimensions(); let (source_width, source_height) = source_image.dimensions();
let cropped_dimension = cmp::max(source_width, source_height); let largest_dimension = cmp::max(source_width, source_height);
let out_dimension = cmp::min(max_dimension, cropped_dimension); let out_dimension = cmp::min(max_dimension, largest_dimension);
let hash = hash(real_path, out_dimension); let hash = hash(real_path, out_dimension);
out_path.push(format!("{}.png", hash.to_string())); out_path.push(format!("{}.jpg", hash.to_string()));
if !out_path.exists() { if !out_path.exists() {
let quality = 95;
let source_aspect_ratio: f32 = source_width as f32 / source_height as f32; let source_aspect_ratio: f32 = source_width as f32 / source_height as f32;
let mut final_image;
if source_aspect_ratio < 0.8 || source_aspect_ratio > 1.2 { if source_aspect_ratio < 0.8 || source_aspect_ratio > 1.2 {
let scaled_image = let scaled_image =
source_image.resize(out_dimension, out_dimension, FilterType::Lanczos3); source_image.resize(out_dimension, out_dimension, FilterType::Lanczos3);
let (scaled_width, scaled_height) = scaled_image.dimensions(); let (scaled_width, scaled_height) = scaled_image.dimensions();
let mut final_image = ImageBuffer::new(out_dimension, out_dimension); let background = image::Rgb {
data: [255 as u8, 255 as u8, 255 as u8],
};
final_image = DynamicImage::ImageRgb8(ImageBuffer::from_pixel(
out_dimension,
out_dimension,
background,
));
final_image.copy_from( final_image.copy_from(
&scaled_image, &scaled_image,
(out_dimension - scaled_width) / 2, (out_dimension - scaled_width) / 2,
(out_dimension - scaled_height) / 2, (out_dimension - scaled_height) / 2,
); );
final_image.save(&out_path)?; final_image.write_to(&mut out_file, ImageOutputFormat::JPEG(quality))?;
} else { } else {
let final_image = final_image =
source_image.resize_exact(max_dimension, out_dimension, FilterType::Lanczos3); source_image.resize_exact(out_dimension, out_dimension, FilterType::Lanczos3);
final_image.save(&out_path)?;
}; };
let mut out_file = File::create(&out_path)?;
final_image.write_to(&mut out_file, ImageOutputFormat::JPEG(quality))?;
} }
Ok(out_path) Ok(out_path)