mod decoder;
mod encoder;
mod error;
mod ffi;
mod info;
mod sys;
pub use decoder::{DecoderConfig, WebpDecoder};
pub use encoder::{EncoderConfig, WebpEncoder};
pub use error::{Result, WebpError};
pub use info::ImageInfo;
use std::io::Cursor;
use std::ops::Deref;
use image::{DynamicImage, EncodableLayout, ImageBuffer, ImageDecoder, PixelWithColorType};
pub fn libwebp_version() -> String {
let v = unsafe { sys::WebPGetEncoderVersion() } as u32;
let major = (v >> 16) & 0xff;
let minor = (v >> 8) & 0xff;
let patch = v & 0xff;
format!("{major}.{minor}.{patch}")
}
pub fn encode(image: &DynamicImage) -> Result<Vec<u8>> {
let mut buf = Vec::new();
image.write_with_encoder(WebpEncoder::new(&mut buf))?;
Ok(buf)
}
pub fn encode_buffer<P, C>(buffer: &ImageBuffer<P, C>) -> Result<Vec<u8>>
where
P: PixelWithColorType,
[P::Subpixel]: EncodableLayout,
C: Deref<Target = [P::Subpixel]>,
{
let mut buf = Vec::new();
buffer.write_with_encoder(WebpEncoder::new(&mut buf))?;
Ok(buf)
}
pub fn decode(data: &[u8]) -> Result<DynamicImage> {
let decoder = WebpDecoder::new(Cursor::new(data))?;
Ok(DynamicImage::from_decoder(decoder)?)
}
pub fn probe(data: &[u8]) -> Result<ImageInfo> {
let decoder = WebpDecoder::new(Cursor::new(data))?;
let (width, height) = decoder.dimensions();
Ok(ImageInfo {
width,
height,
color_type: decoder.color_type(),
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn reports_libwebp_version() {
let version = libwebp_version();
println!("linked libwebp version: {version}");
assert!(!version.is_empty());
}
}