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}