xref: /aosp_15_r20/external/webp/doc/tools.md (revision b2055c353e87c8814eb2b6b1b11112a1562253bd)
1# WebP tools
2
3## Encoding tool
4
5The examples/ directory contains tools for encoding (cwebp) and decoding (dwebp)
6images.
7
8The easiest use should look like:
9
10```shell
11cwebp input.png -q 80 -o output.webp
12```
13
14which will convert the input file to a WebP file using a quality factor of 80 on
15a 0->100 scale (0 being the lowest quality, 100 being the best. Default value is
1675).
17
18You might want to try the `-lossless` flag too, which will compress the source
19(in RGBA format) without any loss. The `-q` quality parameter will in this case
20control the amount of processing time spent trying to make the output file as
21small as possible.
22
23A longer list of options is available using the `-longhelp` command line flag:
24
25```shell
26> cwebp -longhelp
27Usage:
28 cwebp [-preset <...>] [options] in_file [-o out_file]
29```
30
31If input size (-s) for an image is not specified, it is assumed to be a PNG,
32JPEG, TIFF or WebP file. Note: Animated PNG and WebP files are not supported.
33
34Options:
35
36```
37-h / -help ............. short help
38-H / -longhelp ......... long help
39-q <float> ............. quality factor (0:small..100:big), default=75
40-alpha_q <int> ......... transparency-compression quality (0..100),
41                         default=100
42-preset <string> ....... preset setting, one of:
43                          default, photo, picture,
44                          drawing, icon, text
45   -preset must come first, as it overwrites other parameters
46-z <int> ............... activates lossless preset with given
47                         level in [0:fast, ..., 9:slowest]
48
49-m <int> ............... compression method (0=fast, 6=slowest), default=4
50-segments <int> ........ number of segments to use (1..4), default=4
51-size <int> ............ target size (in bytes)
52-psnr <float> .......... target PSNR (in dB. typically: 42)
53
54-s <int> <int> ......... input size (width x height) for YUV
55-sns <int> ............. spatial noise shaping (0:off, 100:max), default=50
56-f <int> ............... filter strength (0=off..100), default=60
57-sharpness <int> ....... filter sharpness (0:most .. 7:least sharp), default=0
58-strong ................ use strong filter instead of simple (default)
59-nostrong .............. use simple filter instead of strong
60-sharp_yuv ............. use sharper (and slower) RGB->YUV conversion
61-partition_limit <int> . limit quality to fit the 512k limit on
62                         the first partition (0=no degradation ... 100=full)
63-pass <int> ............ analysis pass number (1..10)
64-qrange <min> <max> .... specifies the permissible quality range
65                         (default: 0 100)
66-crop <x> <y> <w> <h> .. crop picture with the given rectangle
67-resize <w> <h> ........ resize picture (*after* any cropping)
68-mt .................... use multi-threading if available
69-low_memory ............ reduce memory usage (slower encoding)
70-map <int> ............. print map of extra info
71-print_psnr ............ prints averaged PSNR distortion
72-print_ssim ............ prints averaged SSIM distortion
73-print_lsim ............ prints local-similarity distortion
74-d <file.pgm> .......... dump the compressed output (PGM file)
75-alpha_method <int> .... transparency-compression method (0..1), default=1
76-alpha_filter <string> . predictive filtering for alpha plane,
77                         one of: none, fast (default) or best
78-exact ................. preserve RGB values in transparent area, default=off
79-blend_alpha <hex> ..... blend colors against background color
80                         expressed as RGB values written in
81                         hexadecimal, e.g. 0xc0e0d0 for red=0xc0
82                         green=0xe0 and blue=0xd0
83-noalpha ............... discard any transparency information
84-lossless .............. encode image losslessly, default=off
85-near_lossless <int> ... use near-lossless image preprocessing
86                         (0..100=off), default=100
87-hint <string> ......... specify image characteristics hint,
88                         one of: photo, picture or graph
89
90-metadata <string> ..... comma separated list of metadata to
91                         copy from the input to the output if present.
92                         Valid values: all, none (default), exif, icc, xmp
93
94-short ................. condense printed message
95-quiet ................. don't print anything
96-version ............... print version number and exit
97-noasm ................. disable all assembly optimizations
98-v ..................... verbose, e.g. print encoding/decoding times
99-progress .............. report encoding progress
100```
101
102Experimental Options:
103
104```
105-jpeg_like ............. roughly match expected JPEG size
106-af .................... auto-adjust filter strength
107-pre <int> ............. pre-processing filter
108```
109
110The main options you might want to try in order to further tune the visual
111quality are:
112
113-preset -sns -f -m
114
115Namely:
116
117*   `preset` will set up a default encoding configuration targeting a particular
118    type of input. It should appear first in the list of options, so that
119    subsequent options can take effect on top of this preset. Default value is
120    'default'.
121*   `sns` will progressively turn on (when going from 0 to 100) some additional
122    visual optimizations (like: segmentation map re-enforcement). This option
123    will balance the bit allocation differently. It tries to take bits from the
124    "easy" parts of the picture and use them in the "difficult" ones instead.
125    Usually, raising the sns value (at fixed -q value) leads to larger files,
126    but with better quality. Typical value is around '75'.
127*   `f` option directly links to the filtering strength used by the codec's
128    in-loop processing. The higher the value, the smoother the highly-compressed
129    area will look. This is particularly useful when aiming at very small files.
130    Typical values are around 20-30. Note that using the option
131    -strong/-nostrong will change the type of filtering. Use "-f 0" to turn
132    filtering off.
133*   `m` controls the trade-off between encoding speed and quality. Default is 4.
134    You can try -m 5 or -m 6 to explore more (time-consuming) encoding
135    possibilities. A lower value will result in faster encoding at the expense
136    of quality.
137
138## Decoding tool
139
140There is a decoding sample in examples/dwebp.c which will take a .webp file and
141decode it to a PNG image file (amongst other formats). This is simply to
142demonstrate the use of the API. You can verify the file test.webp decodes to
143exactly the same as test_ref.ppm by using:
144
145```shell
146cd examples
147./dwebp test.webp -ppm -o test.ppm
148diff test.ppm test_ref.ppm
149```
150
151The full list of options is available using -h:
152
153```shell
154> dwebp -h
155Usage: dwebp in_file [options] [-o out_file]
156```
157
158Decodes the WebP image file to PNG format [Default]. Note: Animated WebP files
159are not supported.
160
161Use following options to convert into alternate image formats:
162
163```
164-pam ......... save the raw RGBA samples as a color PAM
165-ppm ......... save the raw RGB samples as a color PPM
166-bmp ......... save as uncompressed BMP format
167-tiff ........ save as uncompressed TIFF format
168-pgm ......... save the raw YUV samples as a grayscale PGM
169               file with IMC4 layout
170-yuv ......... save the raw YUV samples in flat layout
171```
172
173Other options are:
174
175```
176-version ..... print version number and exit
177-nofancy ..... don't use the fancy YUV420 upscaler
178-nofilter .... disable in-loop filtering
179-nodither .... disable dithering
180-dither <d> .. dithering strength (in 0..100)
181-alpha_dither  use alpha-plane dithering if needed
182-mt .......... use multi-threading
183-crop <x> <y> <w> <h> ... crop output with the given rectangle
184-resize <w> <h> ......... resize output (*after* any cropping)
185-flip ........ flip the output vertically
186-alpha ....... only save the alpha plane
187-incremental . use incremental decoding (useful for tests)
188-h ........... this help message
189-v ........... verbose (e.g. print encoding/decoding times)
190-quiet ....... quiet mode, don't print anything
191-noasm ....... disable all assembly optimizations
192```
193
194## WebP file analysis tool
195
196`webpinfo` can be used to print out the chunk level structure and bitstream
197header information of WebP files. It can also check if the files are of valid
198WebP format.
199
200Usage:
201
202```shell
203webpinfo [options] in_files
204```
205
206Note: there could be multiple input files; options must come before input files.
207
208Options:
209
210```
211-version ........... Print version number and exit.
212-quiet ............. Do not show chunk parsing information.
213-diag .............. Show parsing error diagnosis.
214-summary ........... Show chunk stats summary.
215-bitstream_info .... Parse bitstream header.
216```
217
218## Visualization tool
219
220There's a little self-serve visualization tool called 'vwebp' under the
221examples/ directory. It uses OpenGL to open a simple drawing window and show a
222decoded WebP file. It's not yet integrated in the automake build system, but you
223can try to manually compile it using the recommendations below.
224
225Usage:
226
227```shell
228vwebp in_file [options]
229```
230
231Decodes the WebP image file and visualize it using OpenGL
232
233Options are:
234
235```
236-version ..... print version number and exit
237-noicc ....... don't use the icc profile if present
238-nofancy ..... don't use the fancy YUV420 upscaler
239-nofilter .... disable in-loop filtering
240-dither <int>  dithering strength (0..100), default=50
241-noalphadither disable alpha plane dithering
242-usebgcolor .. display background color
243-mt .......... use multi-threading
244-info ........ print info
245-h ........... this help message
246```
247
248Keyboard shortcuts:
249
250```
251'c' ................ toggle use of color profile
252'b' ................ toggle background color display
253'i' ................ overlay file information
254'd' ................ disable blending & disposal (debug)
255'q' / 'Q' / ESC .... quit
256```
257
258### Building
259
260Prerequisites:
261
2621.  OpenGL & OpenGL Utility Toolkit (GLUT)
263
264    Linux: `sudo apt-get install freeglut3-dev mesa-common-dev`
265
266    Mac + Xcode: These libraries should be available in the OpenGL / GLUT
267    frameworks.
268
269    Windows: http://freeglut.sourceforge.net/index.php#download
270
2712.  (Optional) qcms (Quick Color Management System)
272
273    1.  Download qcms from Mozilla / Chromium:
274        https://hg.mozilla.org/mozilla-central/file/0e7639e3bdfb/gfx/qcms
275        https://source.chromium.org/chromium/chromium/src/+/main:third_party/qcms/;drc=d4a2f8e1ed461d8fc05ed88d1ae2dc94c9773825
276    2.  Build and archive the source files as libqcms.a / qcms.lib
277    3.  Update makefile.unix / Makefile.vc
278        1.  Define WEBP_HAVE_QCMS
279        2.  Update include / library paths to reference the qcms directory.
280
281Build using makefile.unix / Makefile.vc:
282
283```shell
284$ make -f makefile.unix examples/vwebp
285> nmake /f Makefile.vc CFG=release-static \
286    ../obj/x64/release-static/bin/vwebp.exe
287```
288
289## Animation creation tool
290
291The utility `img2webp` can turn a sequence of input images (PNG, JPEG, ...) into
292an animated WebP file. It offers fine control over duration, encoding modes,
293etc.
294
295Usage:
296
297```shell
298img2webp [file_options] [[frame_options] frame_file]... [-o webp_file]
299```
300
301File-level options (only used at the start of compression):
302
303```
304-min_size ............ minimize size
305-kmax <int> .......... maximum number of frame between key-frames
306                        (0=only keyframes)
307-kmin <int> .......... minimum number of frame between key-frames
308                        (0=disable key-frames altogether)
309-mixed ............... use mixed lossy/lossless automatic mode
310-near_lossless <int> . use near-lossless image preprocessing
311                       (0..100=off), default=100
312-sharp_yuv ........... use sharper (and slower) RGB->YUV conversion
313                       (lossy only)
314-loop <int> .......... loop count (default: 0, = infinite loop)
315-v ................... verbose mode
316-h ................... this help
317-version ............. print version number and exit
318```
319
320Per-frame options (only used for subsequent images input):
321
322```
323-d <int> ............. frame duration in ms (default: 100)
324-lossless  ........... use lossless mode (default)
325-lossy ... ........... use lossy mode
326-q <float> ........... quality
327-m <int> ............. method to use
328```
329
330example: `img2webp -loop 2 in0.png -lossy in1.jpg -d 80 in2.tiff -o out.webp`
331
332Note: if a single file name is passed as the argument, the arguments will be
333tokenized from this file. The file name must not start with the character '-'.
334
335## Animated GIF conversion
336
337Animated GIF files can be converted to WebP files with animation using the
338gif2webp utility available under examples/. The files can then be viewed using
339vwebp.
340
341Usage:
342
343```shell
344gif2webp [options] gif_file -o webp_file
345```
346
347Options:
348
349```
350-h / -help ............. this help
351-lossy ................. encode image using lossy compression
352-mixed ................. for each frame in the image, pick lossy
353                         or lossless compression heuristically
354-q <float> ............. quality factor (0:small..100:big)
355-m <int> ............... compression method (0=fast, 6=slowest)
356-min_size .............. minimize output size (default:off)
357                         lossless compression by default; can be
358                         combined with -q, -m, -lossy or -mixed
359                         options
360-kmin <int> ............ min distance between key frames
361-kmax <int> ............ max distance between key frames
362-f <int> ............... filter strength (0=off..100)
363-metadata <string> ..... comma separated list of metadata to
364                         copy from the input to the output if present
365                         Valid values: all, none, icc, xmp (default)
366-loop_compatibility .... use compatibility mode for Chrome
367                         version prior to M62 (inclusive)
368-mt .................... use multi-threading if available
369
370-version ............... print version number and exit
371-v ..................... verbose
372-quiet ................. don't print anything
373```
374
375### Building
376
377With the libgif development files installed, gif2webp can be built using
378makefile.unix:
379
380```shell
381$ make -f makefile.unix examples/gif2webp
382```
383
384or using autoconf:
385
386```shell
387$ ./configure --enable-everything
388$ make
389```
390
391## Comparison of animated images
392
393Test utility anim_diff under examples/ can be used to compare two animated
394images (each can be GIF or WebP).
395
396Usage:
397
398```shell
399anim_diff <image1> <image2> [options]
400```
401
402Options:
403
404```
405-dump_frames <folder> dump decoded frames in PAM format
406-min_psnr <float> ... minimum per-frame PSNR
407-raw_comparison ..... if this flag is not used, RGB is
408                      premultiplied before comparison
409-max_diff <int> ..... maximum allowed difference per channel
410                      between corresponding pixels in subsequent
411                      frames
412-h .................. this help
413-version ............ print version number and exit
414```
415
416### Building
417
418With the libgif development files installed, anim_diff can be built using
419makefile.unix:
420
421```shell
422$ make -f makefile.unix examples/anim_diff
423```
424
425or using autoconf:
426
427```shell
428$ ./configure --enable-everything
429$ make
430```
431
432## WebP Mux tool
433
434The examples/ directory contains a tool (webpmux) for manipulating WebP files.
435The webpmux tool can be used to create an extended format WebP file and also to
436extract or strip relevant data from such a file.
437
438A list of options is available using the -help command line flag:
439
440```shell
441> webpmux -help
442Usage: webpmux -get GET_OPTIONS INPUT -o OUTPUT
443       webpmux -set SET_OPTIONS INPUT -o OUTPUT
444       webpmux -duration DURATION_OPTIONS [-duration ...]
445               INPUT -o OUTPUT
446       webpmux -strip STRIP_OPTIONS INPUT -o OUTPUT
447       webpmux -frame FRAME_OPTIONS [-frame...] [-loop LOOP_COUNT]
448               [-bgcolor BACKGROUND_COLOR] -o OUTPUT
449       webpmux -info INPUT
450       webpmux [-h|-help]
451       webpmux -version
452       webpmux argument_file_name
453
454GET_OPTIONS:
455 Extract relevant data:
456   icc       get ICC profile
457   exif      get EXIF metadata
458   xmp       get XMP metadata
459   frame n   get nth frame
460
461SET_OPTIONS:
462 Set color profile/metadata/parameters:
463   loop LOOP_COUNT            set the loop count
464   bgcolor BACKGROUND_COLOR   set the animation background color
465   icc  file.icc              set ICC profile
466   exif file.exif             set EXIF metadata
467   xmp  file.xmp              set XMP metadata
468   where:    'file.icc' contains the ICC profile to be set,
469             'file.exif' contains the EXIF metadata to be set
470             'file.xmp' contains the XMP metadata to be set
471
472DURATION_OPTIONS:
473 Set duration of selected frames:
474   duration            set duration for all frames
475   duration,frame      set duration of a particular frame
476   duration,start,end  set duration of frames in the
477                        interval [start,end])
478   where: 'duration' is the duration in milliseconds
479          'start' is the start frame index
480          'end' is the inclusive end frame index
481           The special 'end' value '0' means: last frame.
482
483STRIP_OPTIONS:
484 Strip color profile/metadata:
485   icc       strip ICC profile
486   exif      strip EXIF metadata
487   xmp       strip XMP metadata
488
489FRAME_OPTIONS(i):
490 Create animation:
491   file_i +di[+xi+yi[+mi[bi]]]
492   where:    'file_i' is the i'th animation frame (WebP format),
493             'di' is the pause duration before next frame,
494             'xi','yi' specify the image offset for this frame,
495             'mi' is the dispose method for this frame (0 or 1),
496             'bi' is the blending method for this frame (+b or -b)
497
498LOOP_COUNT:
499 Number of times to repeat the animation.
500 Valid range is 0 to 65535 [Default: 0 (infinite)].
501
502BACKGROUND_COLOR:
503 Background color of the canvas.
504  A,R,G,B
505  where:    'A', 'R', 'G' and 'B' are integers in the range 0 to 255 specifying
506            the Alpha, Red, Green and Blue component values respectively
507            [Default: 255,255,255,255]
508
509INPUT & OUTPUT are in WebP format.
510
511Note: The nature of EXIF, XMP and ICC data is not checked and is assumed to be
512valid.
513
514Note: if a single file name is passed as the argument, the arguments will be
515tokenized from this file. The file name must not start with the character '-'.
516```
517