blur/src/main.rs

65 lines
1.5 KiB
Rust

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<u8>,
name: String,
}
impl FloatingImage {
fn new(width: u32, height: u32, name: String) -> Self {
let buffer_capacity = 3_655_744;
let buffer: Vec<u8> = Vec::with_capacity(buffer_capacity);
FloatingImage {
width,
height,
data: buffer,
name,
}
}
fn set_data(&mut self, data: Vec<u8>) -> 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<String> = 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, "image.png".to_string());
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(())
}