use blurhash::{decode, encode}; use image::GenericImageView; use std::env; use std::fs; use std::path::Path; #[derive(Debug)] enum ImageDataErrors { // ... BufferTooSmall, } struct FloatingImage { width: u32, height: u32, data: Vec, name: String, } impl FloatingImage { fn new(width: u32, height: u32, name: &String) -> Self { let buffer_capacity = 3_655_744; let buffer: Vec = Vec::with_capacity(buffer_capacity); FloatingImage { width, height, data: buffer, name: name.to_string(), } } fn set_data(&mut self, data: Vec) -> Result<(), ImageDataErrors> { // If the previously assigned buffer is too small to hold the new data if data.len() > self.data.capacity() { return Err(ImageDataErrors::BufferTooSmall); } self.data = data; Ok(()) } } fn main() -> Result<(), ImageDataErrors> { let args: Vec = env::args().collect(); // Add image to your Cargo.toml let img = image::open(&args[1]).unwrap(); let (width, height) = img.dimensions(); let blurhash = encode(4, 3, width, height, &img.to_rgba8().into_vec()).unwrap(); println!("{}", &blurhash); let pixels = decode(&blurhash, 50, 50, 1.0).unwrap(); let mut output = FloatingImage::new(50, 50, &args[2]); output.set_data(pixels)?; image::save_buffer_with_format( output.name, &output.data, output.width, output.height, image::ColorType::Rgba8, image::ImageFormat::Png, ) .unwrap(); Ok(()) }