libavif_image/
lib.rs

1//! Load and Save AVIF from [image](https://crates.io/crates/image)
2//! types.
3//!
4//! Converts to and from YUV (`image` only does RGB).
5
6use image::{DynamicImage, ImageBuffer};
7
8use libavif::AvifData;
9pub use libavif::{is_avif, Error};
10
11/// Read data that is in an AVIF file and load it into an image
12pub 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
20/// Save an image into an AVIF file
21pub 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}