use image::{DynamicImage, ImageBuffer};
use libavif::AvifData;
pub use libavif::{is_avif, Error};
pub fn read(buf: &[u8]) -> Result<DynamicImage, Error> {
let pixels = libavif::decode_rgb(buf)?;
let buffer = ImageBuffer::from_vec(pixels.width(), pixels.height(), pixels.to_vec())
.expect("pixels doesn't fit image::ImageBuffer");
Ok(DynamicImage::ImageRgba8(buffer))
}
pub fn save(img: &DynamicImage) -> Result<AvifData, Error> {
let data = match img {
DynamicImage::ImageRgb8(img) => {
let rgb = img.as_flat_samples();
libavif::encode_rgb8(img.width(), img.height(), rgb.as_slice())?
}
DynamicImage::ImageRgba8(img) => {
let rgb = img.as_flat_samples();
libavif::encode_rgb8(img.width(), img.height(), rgb.as_slice())?
}
DynamicImage::ImageLuma8(img) => {
let rgb = img.as_flat_samples();
libavif::encode_rgb8(img.width(), img.height(), rgb.as_slice())?
}
_ => return Err(Error::UnsupportedImageType),
};
Ok(data)
}