use crate::{avif, jpeg, png, webp};
use anyhow::{Result, bail};
use image::DynamicImage;
use versatiles_core::{Blob, TileFormat};
use versatiles_derive::context;
#[context("encoding {}x{} {:?} as {:?} (q={:?}, e={:?})", image.width(), image.height(), image.color(), format, quality, effort)]
pub fn encode(image: &DynamicImage, format: TileFormat, quality: Option<u8>, effort: Option<u8>) -> Result<Blob> {
match format {
TileFormat::AVIF => avif::encode(image, quality, effort),
TileFormat::JPG => jpeg::encode(image, quality),
TileFormat::PNG => png::encode(image, effort),
TileFormat::WEBP => webp::encode(image, quality, effort),
_ => bail!("Unsupported format '{format}' for image encoding"),
}
}
#[context("decoding {:?} image ({} bytes)", format, blob.len())]
pub fn decode(blob: &Blob, format: TileFormat) -> Result<DynamicImage> {
match format {
TileFormat::AVIF => avif::blob2image(blob),
TileFormat::JPG => jpeg::blob2image(blob),
TileFormat::PNG => png::blob2image(blob),
TileFormat::WEBP => webp::blob2image(blob),
_ => bail!("Unsupported format '{format}' for image decoding"),
}
}