Skip to main content

encode_lossless_image_to_webp_with_options

Function encode_lossless_image_to_webp_with_options 

Source
pub fn encode_lossless_image_to_webp_with_options(
    image: &ImageBuffer,
    options: &LosslessEncodingOptions,
) -> Result<Vec<u8>, EncoderError>
Expand description

Encodes an ImageBuffer to a still lossless WebP container with explicit options.

Examples found in repository?
examples/bmp2webp.rs (line 261)
187fn main() -> Result<(), Error> {
188    let mut args = std::env::args_os().skip(1);
189    let mut input = None;
190    let mut output = None;
191    let mut options = LosslessEncodingOptions::default();
192    let mut lossy = false;
193    let mut lossy_options = LossyEncodingOptions::default();
194    let mut shared_optimization_level = None;
195    let mut lossless_optimization_explicit = false;
196    let mut lossy_optimization_explicit = false;
197
198    while let Some(arg) = args.next() {
199        match arg.to_string_lossy().as_ref() {
200            "--lossy" => lossy = true,
201            "--opt" | "--opt-level" | "-O" => {
202                let value = args.next().ok_or_else(|| invalid_input(usage()))?;
203                options.optimization_level = parse_optimization_level(&value.to_string_lossy())?;
204                lossless_optimization_explicit = true;
205            }
206            "--quality" | "-q" => {
207                let value = args.next().ok_or_else(|| invalid_input(usage()))?;
208                lossy_options.quality = parse_quality(&value.to_string_lossy())?;
209            }
210            "-z" => {
211                let value = args.next().ok_or_else(|| invalid_input(usage()))?;
212                shared_optimization_level = Some(parse_u8_level(
213                    &value.to_string_lossy(),
214                    "optimization level",
215                )?);
216            }
217            "--lossy-opt-level" => {
218                let value = args.next().ok_or_else(|| invalid_input(usage()))?;
219                lossy_options.optimization_level =
220                    parse_lossy_optimization_level(&value.to_string_lossy())?;
221                lossy_optimization_explicit = true;
222            }
223            _ => {
224                if input.is_none() {
225                    input = Some(PathBuf::from(arg));
226                } else if output.is_none() {
227                    output = Some(PathBuf::from(arg));
228                } else {
229                    return Err(invalid_input(usage()));
230                }
231            }
232        }
233    }
234
235    if let Some(level) = shared_optimization_level {
236        if lossy {
237            if !lossy_optimization_explicit {
238                lossy_options.optimization_level = if level <= 9 {
239                    level
240                } else {
241                    return Err(invalid_input("lossy optimization level must be in 0..=9"));
242                };
243            }
244        } else if !lossless_optimization_explicit {
245            options.optimization_level = if level <= 9 {
246                level
247            } else {
248                return Err(invalid_input("optimization level must be in 0..=9"));
249            };
250        }
251    }
252
253    let input = input.ok_or_else(|| invalid_input(usage()))?;
254    let output = output.unwrap_or_else(|| default_output_path(&input));
255
256    let data = fs::read(&input)?;
257    let image = decode_bmp_to_rgba(&data)?;
258    let webp = if lossy {
259        encode_lossy_image_to_webp_with_options(&image, &lossy_options)?
260    } else {
261        encode_lossless_image_to_webp_with_options(&image, &options)?
262    };
263
264    if let Some(parent) = output.parent() {
265        if !parent.as_os_str().is_empty() {
266            fs::create_dir_all(parent)?;
267        }
268    }
269    fs::write(&output, webp)?;
270
271    println!("{}", output.display());
272    Ok(())
273}