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}