Skip to main content

fast_webp/
image_api.rs

1use crate::encode::{encode_rgb, encode_rgba};
2use crate::error::WebpError;
3use crate::options::WebpOptions;
4use crate::pixel::{gray_alpha_to_rgba, gray_to_rgb};
5
6pub fn encode_dynamic_image(
7    image: &image::DynamicImage,
8    options: WebpOptions,
9) -> Result<Vec<u8>, WebpError> {
10    match image {
11        image::DynamicImage::ImageRgb8(rgb) => encode_rgb_image(rgb, options),
12        image::DynamicImage::ImageRgba8(rgba) => encode_rgba_image(rgba, options),
13        image::DynamicImage::ImageLuma8(gray) => {
14            let rgb = gray_to_rgb(gray.as_raw());
15            encode_rgb(&rgb, gray.width(), gray.height(), options)
16        }
17        image::DynamicImage::ImageLumaA8(gray_alpha) => {
18            let rgba = gray_alpha_to_rgba(gray_alpha.as_raw());
19            encode_rgba(&rgba, gray_alpha.width(), gray_alpha.height(), options)
20        }
21        image::DynamicImage::ImageRgb16(_) | image::DynamicImage::ImageRgb32F(_) => {
22            let rgb = image.to_rgb8();
23            encode_rgb_image(&rgb, options)
24        }
25        _ => {
26            let rgba = image.to_rgba8();
27            encode_rgba_image(&rgba, options)
28        }
29    }
30}
31
32pub fn encode_rgb_image(
33    image: &image::RgbImage,
34    options: WebpOptions,
35) -> Result<Vec<u8>, WebpError> {
36    encode_rgb(image.as_raw(), image.width(), image.height(), options)
37}
38
39pub fn encode_rgba_image(
40    image: &image::RgbaImage,
41    options: WebpOptions,
42) -> Result<Vec<u8>, WebpError> {
43    encode_rgba(image.as_raw(), image.width(), image.height(), options)
44}