use image::{
    codecs::png::PngEncoder, imageops::FilterType, DynamicImage, GenericImageView, ImageResult,
};
use std::io::Cursor;
pub fn image_from_buf(buf: &[u8]) -> ImageResult<DynamicImage> {
    image::io::Reader::new(Cursor::new(buf))
        .with_guessed_format()
        .unwrap() .decode()
}
pub fn im_resize_clamped(im: &DynamicImage, w: u32, h: u32) -> DynamicImage {
    im.resize(w, h, FilterType::Triangle)
}
pub fn png_encode(im: DynamicImage) -> ImageResult<Vec<u8>> {
    let mut out = Vec::new();
    let encoder = PngEncoder::new(&mut out);
    let w = im.width();
    let h = im.height();
    let color = im.color();
    encoder.encode(&im.into_bytes(), w, h, color)?;
    Ok(out)
}