1use image::{DynamicImage, ImageBuffer};
7
8use libavif::AvifData;
9pub use libavif::{is_avif, Error};
10
11pub fn read(buf: &[u8]) -> Result<DynamicImage, Error> {
13 let pixels = libavif::decode_rgb(buf)?;
14 let buffer = ImageBuffer::from_vec(pixels.width(), pixels.height(), pixels.to_vec())
15 .expect("pixels doesn't fit image::ImageBuffer");
16
17 Ok(DynamicImage::ImageRgba8(buffer))
18}
19
20pub fn save(img: &DynamicImage) -> Result<AvifData, Error> {
22 let data = match img {
23 DynamicImage::ImageRgb8(img) => {
24 let rgb = img.as_flat_samples();
25 libavif::encode_rgb8(img.width(), img.height(), rgb.as_slice())?
26 }
27 DynamicImage::ImageRgba8(img) => {
28 let rgb = img.as_flat_samples();
29 libavif::encode_rgb8(img.width(), img.height(), rgb.as_slice())?
30 }
31 DynamicImage::ImageLuma8(img) => {
32 let rgb = img.as_flat_samples();
33 libavif::encode_rgb8(img.width(), img.height(), rgb.as_slice())?
34 }
35 _ => return Err(Error::UnsupportedImageType),
36 };
37
38 Ok(data)
39}