| __ __ ____ ____ ____ | |
| / \\/ \/ _ \/ _ )/ _ \ | |
| \ / __/ _ \ __/ | |
| \__\__/\____/\_____/__/ ____ ___ | |
| / _/ / \ \ / _ \/ _/ | |
| / \_/ / / \ \ __/ \__ | |
| \____/____/\_____/_____/____/v1.0.0 | |
| Description: | |
| ============ | |
| WebP codec: library to encode and decode images in WebP format. This package | |
| contains the library that can be used in other programs to add WebP support, | |
| as well as the command line tools 'cwebp' and 'dwebp'. | |
| See http://developers.google.com/speed/webp | |
| The latest source tree is available at | |
| https://chromium.googlesource.com/webm/libwebp | |
| It is released under the same license as the WebM project. | |
| See http://www.webmproject.org/license/software/ or the | |
| "COPYING" file for details. An additional intellectual | |
| property rights grant can be found in the file PATENTS. | |
| Building: | |
| ========= | |
| Windows build: | |
| -------------- | |
| By running: | |
| nmake /f Makefile.vc CFG=release-static RTLIBCFG=static OBJDIR=output | |
| the directory output\release-static\(x64|x86)\bin will contain the tools | |
| cwebp.exe and dwebp.exe. The directory output\release-static\(x64|x86)\lib will | |
| contain the libwebp static library. | |
| The target architecture (x86/x64) is detected by Makefile.vc from the Visual | |
| Studio compiler (cl.exe) available in the system path. | |
| Unix build using makefile.unix: | |
| ------------------------------- | |
| On platforms with GNU tools installed (gcc and make), running | |
| make -f makefile.unix | |
| will build the binaries examples/cwebp and examples/dwebp, along | |
| with the static library src/libwebp.a. No system-wide installation | |
| is supplied, as this is a simple alternative to the full installation | |
| system based on the autoconf tools (see below). | |
| Please refer to makefile.unix for additional details and customizations. | |
| Using autoconf tools: | |
| --------------------- | |
| Prerequisites: | |
| A compiler (e.g., gcc), make, autoconf, automake, libtool. | |
| On a Debian-like system the following should install everything you need for a | |
| minimal build: | |
| $ sudo apt-get install gcc make autoconf automake libtool | |
| When building from git sources, you will need to run autogen.sh to generate the | |
| configure script. | |
| ./configure | |
| make | |
| make install | |
| should be all you need to have the following files | |
| /usr/local/include/webp/decode.h | |
| /usr/local/include/webp/encode.h | |
| /usr/local/include/webp/types.h | |
| /usr/local/lib/libwebp.* | |
| /usr/local/bin/cwebp | |
| /usr/local/bin/dwebp | |
| installed. | |
| Note: A decode-only library, libwebpdecoder, is available using the | |
| '--enable-libwebpdecoder' flag. The encode library is built separately and can | |
| be installed independently using a minor modification in the corresponding | |
| Makefile.am configure files (see comments there). See './configure --help' for | |
| more options. | |
| Building for MIPS Linux: | |
| ------------------------ | |
| MIPS Linux toolchain stable available releases can be found at: | |
| https://community.imgtec.com/developers/mips/tools/codescape-mips-sdk/available-releases/ | |
| # Add toolchain to PATH | |
| export PATH=$PATH:/path/to/toolchain/bin | |
| # 32-bit build for mips32r5 (p5600) | |
| HOST=mips-mti-linux-gnu | |
| MIPS_CFLAGS="-O3 -mips32r5 -mabi=32 -mtune=p5600 -mmsa -mfp64 \ | |
| -msched-weight -mload-store-pairs -fPIE" | |
| MIPS_LDFLAGS="-mips32r5 -mabi=32 -mmsa -mfp64 -pie" | |
| # 64-bit build for mips64r6 (i6400) | |
| HOST=mips-img-linux-gnu | |
| MIPS_CFLAGS="-O3 -mips64r6 -mabi=64 -mtune=i6400 -mmsa -mfp64 \ | |
| -msched-weight -mload-store-pairs -fPIE" | |
| MIPS_LDFLAGS="-mips64r6 -mabi=64 -mmsa -mfp64 -pie" | |
| ./configure --host=${HOST} --build=`config.guess` \ | |
| CC="${HOST}-gcc -EL" \ | |
| CFLAGS="$MIPS_CFLAGS" \ | |
| LDFLAGS="$MIPS_LDFLAGS" | |
| make | |
| make install | |
| CMake: | |
| ------ | |
| With CMake, you can compile libwebp, cwebp, dwebp, gif2web, img2webp, webpinfo | |
| and the JS bindings. | |
| Prerequisites: | |
| A compiler (e.g., gcc with autotools) and CMake. | |
| On a Debian-like system the following should install everything you need for a | |
| minimal build: | |
| $ sudo apt-get install build-essential cmake | |
| When building from git sources, you will need to run cmake to generate the | |
| makefiles. | |
| mkdir build && cd build && cmake ../ | |
| make | |
| make install | |
| If you also want any of the executables, you will need to enable them through | |
| CMake, e.g.: | |
| cmake -DWEBP_BUILD_CWEBP=ON -DWEBP_BUILD_DWEBP=ON ../ | |
| or through your favorite interface (like ccmake or cmake-qt-gui). | |
| Finally, once installed, you can also use WebP in your CMake project by doing: | |
| find_package(WebP) | |
| which will define the CMake variables WebP_INCLUDE_DIRS and WebP_LIBRARIES. | |
| Gradle: | |
| ------- | |
| The support for Gradle is minimal: it only helps you compile libwebp, cwebp and | |
| dwebp and webpmux_example. | |
| Prerequisites: | |
| A compiler (e.g., gcc with autotools) and gradle. | |
| On a Debian-like system the following should install everything you need for a | |
| minimal build: | |
| $ sudo apt-get install build-essential gradle | |
| When building from git sources, you will need to run the Gradle wrapper with the | |
| appropriate target, e.g. : | |
| ./gradlew buildAllExecutables | |
| SWIG bindings: | |
| -------------- | |
| To generate language bindings from swig/libwebp.swig at least swig-1.3 | |
| (http://www.swig.org) is required. | |
| Currently the following functions are mapped: | |
| Decode: | |
| WebPGetDecoderVersion | |
| WebPGetInfo | |
| WebPDecodeRGBA | |
| WebPDecodeARGB | |
| WebPDecodeBGRA | |
| WebPDecodeBGR | |
| WebPDecodeRGB | |
| Encode: | |
| WebPGetEncoderVersion | |
| WebPEncodeRGBA | |
| WebPEncodeBGRA | |
| WebPEncodeRGB | |
| WebPEncodeBGR | |
| WebPEncodeLosslessRGBA | |
| WebPEncodeLosslessBGRA | |
| WebPEncodeLosslessRGB | |
| WebPEncodeLosslessBGR | |
| See swig/README for more detailed build instructions. | |
| Java bindings: | |
| To build the swig-generated JNI wrapper code at least JDK-1.5 (or equivalent) | |
| is necessary for enum support. The output is intended to be a shared object / | |
| DLL that can be loaded via System.loadLibrary("webp_jni"). | |
| Python bindings: | |
| To build the swig-generated Python extension code at least Python 2.6 is | |
| required. Python < 2.6 may build with some minor changes to libwebp.swig or the | |
| generated code, but is untested. | |
| Encoding tool: | |
| ============== | |
| The examples/ directory contains tools for encoding (cwebp) and | |
| decoding (dwebp) images. | |
| The easiest use should look like: | |
| cwebp input.png -q 80 -o output.webp | |
| which will convert the input file to a WebP file using a quality factor of 80 | |
| on a 0->100 scale (0 being the lowest quality, 100 being the best. Default | |
| value is 75). | |
| You might want to try the -lossless flag too, which will compress the source | |
| (in RGBA format) without any loss. The -q quality parameter will in this case | |
| control the amount of processing time spent trying to make the output file as | |
| small as possible. | |
| A longer list of options is available using the -longhelp command line flag: | |
| > cwebp -longhelp | |
| Usage: | |
| cwebp [-preset <...>] [options] in_file [-o out_file] | |
| If input size (-s) for an image is not specified, it is | |
| assumed to be a PNG, JPEG, TIFF or WebP file. | |
| Options: | |
| -h / -help ............. short help | |
| -H / -longhelp ......... long help | |
| -q <float> ............. quality factor (0:small..100:big), default=75 | |
| -alpha_q <int> ......... transparency-compression quality (0..100), | |
| default=100 | |
| -preset <string> ....... preset setting, one of: | |
| default, photo, picture, | |
| drawing, icon, text | |
| -preset must come first, as it overwrites other parameters | |
| -z <int> ............... activates lossless preset with given | |
| level in [0:fast, ..., 9:slowest] | |
| -m <int> ............... compression method (0=fast, 6=slowest), default=4 | |
| -segments <int> ........ number of segments to use (1..4), default=4 | |
| -size <int> ............ target size (in bytes) | |
| -psnr <float> .......... target PSNR (in dB. typically: 42) | |
| -s <int> <int> ......... input size (width x height) for YUV | |
| -sns <int> ............. spatial noise shaping (0:off, 100:max), default=50 | |
| -f <int> ............... filter strength (0=off..100), default=60 | |
| -sharpness <int> ....... filter sharpness (0:most .. 7:least sharp), default=0 | |
| -strong ................ use strong filter instead of simple (default) | |
| -nostrong .............. use simple filter instead of strong | |
| -sharp_yuv ............. use sharper (and slower) RGB->YUV conversion | |
| -partition_limit <int> . limit quality to fit the 512k limit on | |
| the first partition (0=no degradation ... 100=full) | |
| -pass <int> ............ analysis pass number (1..10) | |
| -crop <x> <y> <w> <h> .. crop picture with the given rectangle | |
| -resize <w> <h> ........ resize picture (after any cropping) | |
| -mt .................... use multi-threading if available | |
| -low_memory ............ reduce memory usage (slower encoding) | |
| -map <int> ............. print map of extra info | |
| -print_psnr ............ prints averaged PSNR distortion | |
| -print_ssim ............ prints averaged SSIM distortion | |
| -print_lsim ............ prints local-similarity distortion | |
| -d <file.pgm> .......... dump the compressed output (PGM file) | |
| -alpha_method <int> .... transparency-compression method (0..1), default=1 | |
| -alpha_filter <string> . predictive filtering for alpha plane, | |
| one of: none, fast (default) or best | |
| -exact ................. preserve RGB values in transparent area, default=off | |
| -blend_alpha <hex> ..... blend colors against background color | |
| expressed as RGB values written in | |
| hexadecimal, e.g. 0xc0e0d0 for red=0xc0 | |
| green=0xe0 and blue=0xd0 | |
| -noalpha ............... discard any transparency information | |
| -lossless .............. encode image losslessly, default=off | |
| -near_lossless <int> ... use near-lossless image | |
| preprocessing (0..100=off), default=100 | |
| -hint <string> ......... specify image characteristics hint, | |
| one of: photo, picture or graph | |
| -metadata <string> ..... comma separated list of metadata to | |
| copy from the input to the output if present. | |
| Valid values: all, none (default), exif, icc, xmp | |
| -short ................. condense printed message | |
| -quiet ................. don't print anything | |
| -version ............... print version number and exit | |
| -noasm ................. disable all assembly optimizations | |
| -v ..................... verbose, e.g. print encoding/decoding times | |
| -progress .............. report encoding progress | |
| Experimental Options: | |
| -jpeg_like ............. roughly match expected JPEG size | |
| -af .................... auto-adjust filter strength | |
| -pre <int> ............. pre-processing filter | |
| The main options you might want to try in order to further tune the | |
| visual quality are: | |
| -preset | |
| -sns | |
| -f | |
| -m | |
| Namely: | |
| * 'preset' will set up a default encoding configuration targeting a | |
| particular type of input. It should appear first in the list of options, | |
| so that subsequent options can take effect on top of this preset. | |
| Default value is 'default'. | |
| * 'sns' will progressively turn on (when going from 0 to 100) some additional | |
| visual optimizations (like: segmentation map re-enforcement). This option | |
| will balance the bit allocation differently. It tries to take bits from the | |
| "easy" parts of the picture and use them in the "difficult" ones instead. | |
| Usually, raising the sns value (at fixed -q value) leads to larger files, | |
| but with better quality. | |
| Typical value is around '75'. | |
| * 'f' option directly links to the filtering strength used by the codec's | |
| in-loop processing. The higher the value, the smoother the | |
| highly-compressed area will look. This is particularly useful when aiming | |
| at very small files. Typical values are around 20-30. Note that using the | |
| option -strong/-nostrong will change the type of filtering. Use "-f 0" to | |
| turn filtering off. | |
| * 'm' controls the trade-off between encoding speed and quality. Default is 4. | |
| You can try -m 5 or -m 6 to explore more (time-consuming) encoding | |
| possibilities. A lower value will result in faster encoding at the expense | |
| of quality. | |
| Decoding tool: | |
| ============== | |
| There is a decoding sample in examples/dwebp.c which will take | |
| a .webp file and decode it to a PNG image file (amongst other formats). | |
| This is simply to demonstrate the use of the API. You can verify the | |
| file test.webp decodes to exactly the same as test_ref.ppm by using: | |
| cd examples | |
| ./dwebp test.webp -ppm -o test.ppm | |
| diff test.ppm test_ref.ppm | |
| The full list of options is available using -h: | |
| > dwebp -h | |
| Usage: dwebp in_file [options] [-o out_file] | |
| Decodes the WebP image file to PNG format [Default] | |
| Use following options to convert into alternate image formats: | |
| -pam ......... save the raw RGBA samples as a color PAM | |
| -ppm ......... save the raw RGB samples as a color PPM | |
| -bmp ......... save as uncompressed BMP format | |
| -tiff ........ save as uncompressed TIFF format | |
| -pgm ......... save the raw YUV samples as a grayscale PGM | |
| file with IMC4 layout | |
| -yuv ......... save the raw YUV samples in flat layout | |
| Other options are: | |
| -version ..... print version number and exit | |
| -nofancy ..... don't use the fancy YUV420 upscaler | |
| -nofilter .... disable in-loop filtering | |
| -nodither .... disable dithering | |
| -dither <d> .. dithering strength (in 0..100) | |
| -alpha_dither use alpha-plane dithering if needed | |
| -mt .......... use multi-threading | |
| -crop <x> <y> <w> <h> ... crop output with the given rectangle | |
| -resize <w> <h> ......... scale the output (*after* any cropping) | |
| -flip ........ flip the output vertically | |
| -alpha ....... only save the alpha plane | |
| -incremental . use incremental decoding (useful for tests) | |
| -h ........... this help message | |
| -v ........... verbose (e.g. print encoding/decoding times) | |
| -quiet ....... quiet mode, don't print anything | |
| -noasm ....... disable all assembly optimizations | |
| WebP file analysis tool: | |
| ======================== | |
| 'webpinfo' can be used to print out the chunk level structure and bitstream | |
| header information of WebP files. It can also check if the files are of valid | |
| WebP format. | |
| Usage: webpinfo [options] in_files | |
| Note: there could be multiple input files; | |
| options must come before input files. | |
| Options: | |
| -version ........... Print version number and exit. | |
| -quiet ............. Do not show chunk parsing information. | |
| -diag .............. Show parsing error diagnosis. | |
| -summary ........... Show chunk stats summary. | |
| -bitstream_info .... Parse bitstream header. | |
| Visualization tool: | |
| =================== | |
| There's a little self-serve visualization tool called 'vwebp' under the | |
| examples/ directory. It uses OpenGL to open a simple drawing window and show | |
| a decoded WebP file. It's not yet integrated in the automake build system, but | |
| you can try to manually compile it using the recommendations below. | |
| Usage: vwebp in_file [options] | |
| Decodes the WebP image file and visualize it using OpenGL | |
| Options are: | |
| -version ..... print version number and exit | |
| -noicc ....... don't use the icc profile if present | |
| -nofancy ..... don't use the fancy YUV420 upscaler | |
| -nofilter .... disable in-loop filtering | |
| -dither <int> dithering strength (0..100), default=50 | |
| -noalphadither disable alpha plane dithering | |
| -mt .......... use multi-threading | |
| -info ........ print info | |
| -h ........... this help message | |
| Keyboard shortcuts: | |
| 'c' ................ toggle use of color profile | |
| 'i' ................ overlay file information | |
| 'd' ................ disable blending & disposal (debug) | |
| 'q' / 'Q' / ESC .... quit | |
| Building: | |
| --------- | |
| Prerequisites: | |
| 1) OpenGL & OpenGL Utility Toolkit (GLUT) | |
| Linux: | |
| $ sudo apt-get install freeglut3-dev mesa-common-dev | |
| Mac + XCode: | |
| - These libraries should be available in the OpenGL / GLUT frameworks. | |
| Windows: | |
| http://freeglut.sourceforge.net/index.php#download | |
| 2) (Optional) qcms (Quick Color Management System) | |
| i. Download qcms from Mozilla / Chromium: | |
| http://hg.mozilla.org/mozilla-central/file/0e7639e3bdfb/gfx/qcms | |
| http://src.chromium.org/viewvc/chrome/trunk/src/third_party/qcms | |
| ii. Build and archive the source files as libqcms.a / qcms.lib | |
| iii. Update makefile.unix / Makefile.vc | |
| a) Define WEBP_HAVE_QCMS | |
| b) Update include / library paths to reference the qcms directory. | |
| Build using makefile.unix / Makefile.vc: | |
| $ make -f makefile.unix examples/vwebp | |
| > nmake /f Makefile.vc CFG=release-static \ | |
| ../obj/x64/release-static/bin/vwebp.exe | |
| Animation creation tool: | |
| ======================== | |
| The utility 'img2webp' can turn a sequence of input images (PNG, JPEG, ...) | |
| into an animated WebP file. It offers fine control over duration, encoding | |
| modes, etc. | |
| Usage: | |
| img2webp [file-level options] [image files...] [per-frame options...] | |
| File-level options (only used at the start of compression): | |
| -min_size ............ minimize size | |
| -loop <int> .......... loop count (default: 0, = infinite loop) | |
| -kmax <int> .......... maximum number of frame between key-frames | |
| (0=only keyframes) | |
| -kmin <int> .......... minimum number of frame between key-frames | |
| (0=disable key-frames altogether) | |
| -mixed ............... use mixed lossy/lossless automatic mode | |
| -v ................... verbose mode | |
| -h ................... this help | |
| -version ............. print version number and exit | |
| Per-frame options (only used for subsequent images input): | |
| -d <int> ............. frame duration in ms (default: 100) | |
| -lossless ........... use lossless mode (default) | |
| -lossy ... ........... use lossy mode | |
| -q <float> ........... quality | |
| -m <int> ............. method to use | |
| example: img2webp -loop 2 in0.png -lossy in1.jpg | |
| -d 80 in2.tiff -o out.webp | |
| Animated GIF conversion: | |
| ======================== | |
| Animated GIF files can be converted to WebP files with animation using the | |
| gif2webp utility available under examples/. The files can then be viewed using | |
| vwebp. | |
| Usage: | |
| gif2webp [options] gif_file -o webp_file | |
| Options: | |
| -h / -help ............. this help | |
| -lossy ................. encode image using lossy compression | |
| -mixed ................. for each frame in the image, pick lossy | |
| or lossless compression heuristically | |
| -q <float> ............. quality factor (0:small..100:big) | |
| -m <int> ............... compression method (0=fast, 6=slowest) | |
| -min_size .............. minimize output size (default:off) | |
| lossless compression by default; can be | |
| combined with -q, -m, -lossy or -mixed | |
| options | |
| -kmin <int> ............ min distance between key frames | |
| -kmax <int> ............ max distance between key frames | |
| -f <int> ............... filter strength (0=off..100) | |
| -metadata <string> ..... comma separated list of metadata to | |
| copy from the input to the output if present | |
| Valid values: all, none, icc, xmp (default) | |
| -loop_compatibility .... use compatibility mode for Chrome | |
| version prior to M62 (inclusive) | |
| -mt .................... use multi-threading if available | |
| -version ............... print version number and exit | |
| -v ..................... verbose | |
| -quiet ................. don't print anything | |
| Building: | |
| --------- | |
| With the libgif development files installed, gif2webp can be built using | |
| makefile.unix: | |
| $ make -f makefile.unix examples/gif2webp | |
| or using autoconf: | |
| $ ./configure --enable-everything | |
| $ make | |
| Comparison of animated images: | |
| ============================== | |
| Test utility anim_diff under examples/ can be used to compare two animated | |
| images (each can be GIF or WebP). | |
| Usage: anim_diff <image1> <image2> [options] | |
| Options: | |
| -dump_frames <folder> dump decoded frames in PAM format | |
| -min_psnr <float> ... minimum per-frame PSNR | |
| -raw_comparison ..... if this flag is not used, RGB is | |
| premultiplied before comparison | |
| -max_diff <int> ..... maximum allowed difference per channel | |
| between corresponding pixels in subsequent | |
| frames | |
| -h .................. this help | |
| -version ............ print version number and exit | |
| Building: | |
| --------- | |
| With the libgif development files and a C++ compiler installed, anim_diff can | |
| be built using makefile.unix: | |
| $ make -f makefile.unix examples/anim_diff | |
| or using autoconf: | |
| $ ./configure --enable-everything | |
| $ make | |
| Encoding API: | |
| ============= | |
| The main encoding functions are available in the header src/webp/encode.h | |
| The ready-to-use ones are: | |
| size_t WebPEncodeRGB(const uint8_t* rgb, int width, int height, int stride, | |
| float quality_factor, uint8_t** output); | |
| size_t WebPEncodeBGR(const uint8_t* bgr, int width, int height, int stride, | |
| float quality_factor, uint8_t** output); | |
| size_t WebPEncodeRGBA(const uint8_t* rgba, int width, int height, int stride, | |
| float quality_factor, uint8_t** output); | |
| size_t WebPEncodeBGRA(const uint8_t* bgra, int width, int height, int stride, | |
| float quality_factor, uint8_t** output); | |
| They will convert raw RGB samples to a WebP data. The only control supplied | |
| is the quality factor. | |
| There are some variants for using the lossless format: | |
| size_t WebPEncodeLosslessRGB(const uint8_t* rgb, int width, int height, | |
| int stride, uint8_t** output); | |
| size_t WebPEncodeLosslessBGR(const uint8_t* bgr, int width, int height, | |
| int stride, uint8_t** output); | |
| size_t WebPEncodeLosslessRGBA(const uint8_t* rgba, int width, int height, | |
| int stride, uint8_t** output); | |
| size_t WebPEncodeLosslessBGRA(const uint8_t* bgra, int width, int height, | |
| int stride, uint8_t** output); | |
| Of course in this case, no quality factor is needed since the compression | |
| occurs without loss of the input values, at the expense of larger output sizes. | |
| Advanced encoding API: | |
| ---------------------- | |
| A more advanced API is based on the WebPConfig and WebPPicture structures. | |
| WebPConfig contains the encoding settings and is not tied to a particular | |
| picture. | |
| WebPPicture contains input data, on which some WebPConfig will be used for | |
| compression. | |
| The encoding flow looks like: | |
| -------------------------------------- BEGIN PSEUDO EXAMPLE | |
| #include <webp/encode.h> | |
| // Setup a config, starting form a preset and tuning some additional | |
| // parameters | |
| WebPConfig config; | |
| if (!WebPConfigPreset(&config, WEBP_PRESET_PHOTO, quality_factor)) | |
| return 0; // version error | |
| } | |
| // ... additional tuning | |
| config.sns_strength = 90; | |
| config.filter_sharpness = 6; | |
| config_error = WebPValidateConfig(&config); // not mandatory, but useful | |
| // Setup the input data | |
| WebPPicture pic; | |
| if (!WebPPictureInit(&pic)) { | |
| return 0; // version error | |
| } | |
| pic.width = width; | |
| pic.height = height; | |
| // allocated picture of dimension width x height | |
| if (!WebPPictureAllocate(&pic)) { | |
| return 0; // memory error | |
| } | |
| // at this point, 'pic' has been initialized as a container, | |
| // and can receive the Y/U/V samples. | |
| // Alternatively, one could use ready-made import functions like | |
| // WebPPictureImportRGB(), which will take care of memory allocation. | |
| // In any case, past this point, one will have to call | |
| // WebPPictureFree(&pic) to reclaim memory. | |
| // Set up a byte-output write method. WebPMemoryWriter, for instance. | |
| WebPMemoryWriter wrt; | |
| WebPMemoryWriterInit(&wrt); // initialize 'wrt' | |
| pic.writer = MyFileWriter; | |
| pic.custom_ptr = my_opaque_structure_to_make_MyFileWriter_work; | |
| // Compress! | |
| int ok = WebPEncode(&config, &pic); // ok = 0 => error occurred! | |
| WebPPictureFree(&pic); // must be called independently of the 'ok' result. | |
| // output data should have been handled by the writer at that point. | |
| // -> compressed data is the memory buffer described by wrt.mem / wrt.size | |
| // deallocate the memory used by compressed data | |
| WebPMemoryWriterClear(&wrt); | |
| -------------------------------------- END PSEUDO EXAMPLE | |
| Decoding API: | |
| ============= | |
| This is mainly just one function to call: | |
| #include "webp/decode.h" | |
| uint8_t* WebPDecodeRGB(const uint8_t* data, size_t data_size, | |
| int* width, int* height); | |
| Please have a look at the file src/webp/decode.h for the details. | |
| There are variants for decoding in BGR/RGBA/ARGB/BGRA order, along with | |
| decoding to raw Y'CbCr samples. One can also decode the image directly into a | |
| pre-allocated buffer. | |
| To detect a WebP file and gather the picture's dimensions, the function: | |
| int WebPGetInfo(const uint8_t* data, size_t data_size, | |
| int* width, int* height); | |
| is supplied. No decoding is involved when using it. | |
| Incremental decoding API: | |
| ========================= | |
| In the case when data is being progressively transmitted, pictures can still | |
| be incrementally decoded using a slightly more complicated API. Decoder state | |
| is stored into an instance of the WebPIDecoder object. This object can be | |
| created with the purpose of decoding either RGB or Y'CbCr samples. | |
| For instance: | |
| WebPDecBuffer buffer; | |
| WebPInitDecBuffer(&buffer); | |
| buffer.colorspace = MODE_BGR; | |
| ... | |
| WebPIDecoder* idec = WebPINewDecoder(&buffer); | |
| As data is made progressively available, this incremental-decoder object | |
| can be used to decode the picture further. There are two (mutually exclusive) | |
| ways to pass freshly arrived data: | |
| either by appending the fresh bytes: | |
| WebPIAppend(idec, fresh_data, size_of_fresh_data); | |
| or by just mentioning the new size of the transmitted data: | |
| WebPIUpdate(idec, buffer, size_of_transmitted_buffer); | |
| Note that 'buffer' can be modified between each call to WebPIUpdate, in | |
| particular when the buffer is resized to accommodate larger data. | |
| These functions will return the decoding status: either VP8_STATUS_SUSPENDED if | |
| decoding is not finished yet or VP8_STATUS_OK when decoding is done. Any other | |
| status is an error condition. | |
| The 'idec' object must always be released (even upon an error condition) by | |
| calling: WebPDelete(idec). | |
| To retrieve partially decoded picture samples, one must use the corresponding | |
| method: WebPIDecGetRGB or WebPIDecGetYUVA. | |
| It will return the last displayable pixel row. | |
| Lastly, note that decoding can also be performed into a pre-allocated pixel | |
| buffer. This buffer must be passed when creating a WebPIDecoder, calling | |
| WebPINewRGB() or WebPINewYUVA(). | |
| Please have a look at the src/webp/decode.h header for further details. | |
| Advanced Decoding API: | |
| ====================== | |
| WebP decoding supports an advanced API which provides on-the-fly cropping and | |
| rescaling, something of great usefulness on memory-constrained environments like | |
| mobile phones. Basically, the memory usage will scale with the output's size, | |
| not the input's, when one only needs a quick preview or a zoomed in portion of | |
| an otherwise too-large picture. Some CPU can be saved too, incidentally. | |
| -------------------------------------- BEGIN PSEUDO EXAMPLE | |
| // A) Init a configuration object | |
| WebPDecoderConfig config; | |
| CHECK(WebPInitDecoderConfig(&config)); | |
| // B) optional: retrieve the bitstream's features. | |
| CHECK(WebPGetFeatures(data, data_size, &config.input) == VP8_STATUS_OK); | |
| // C) Adjust 'config' options, if needed | |
| config.options.no_fancy_upsampling = 1; | |
| config.options.use_scaling = 1; | |
| config.options.scaled_width = scaledWidth(); | |
| config.options.scaled_height = scaledHeight(); | |
| // etc. | |
| // D) Specify 'config' output options for specifying output colorspace. | |
| // Optionally the external image decode buffer can also be specified. | |
| config.output.colorspace = MODE_BGRA; | |
| // Optionally, the config.output can be pointed to an external buffer as | |
| // well for decoding the image. This externally supplied memory buffer | |
| // should be big enough to store the decoded picture. | |
| config.output.u.RGBA.rgba = (uint8_t*) memory_buffer; | |
| config.output.u.RGBA.stride = scanline_stride; | |
| config.output.u.RGBA.size = total_size_of_the_memory_buffer; | |
| config.output.is_external_memory = 1; | |
| // E) Decode the WebP image. There are two variants w.r.t decoding image. | |
| // The first one (E.1) decodes the full image and the second one (E.2) is | |
| // used to incrementally decode the image using small input buffers. | |
| // Any one of these steps can be used to decode the WebP image. | |
| // E.1) Decode full image. | |
| CHECK(WebPDecode(data, data_size, &config) == VP8_STATUS_OK); | |
| // E.2) Decode image incrementally. | |
| WebPIDecoder* const idec = WebPIDecode(NULL, NULL, &config); | |
| CHECK(idec != NULL); | |
| while (bytes_remaining > 0) { | |
| VP8StatusCode status = WebPIAppend(idec, input, bytes_read); | |
| if (status == VP8_STATUS_OK || status == VP8_STATUS_SUSPENDED) { | |
| bytes_remaining -= bytes_read; | |
| } else { | |
| break; | |
| } | |
| } | |
| WebPIDelete(idec); | |
| // F) Decoded image is now in config.output (and config.output.u.RGBA). | |
| // It can be saved, displayed or otherwise processed. | |
| // G) Reclaim memory allocated in config's object. It's safe to call | |
| // this function even if the memory is external and wasn't allocated | |
| // by WebPDecode(). | |
| WebPFreeDecBuffer(&config.output); | |
| -------------------------------------- END PSEUDO EXAMPLE | |
| Bugs: | |
| ===== | |
| Please report all bugs to the issue tracker: | |
| https://bugs.chromium.org/p/webp | |
| Patches welcome! See this page to get started: | |
| http://www.webmproject.org/code/contribute/submitting-patches/ | |
| Discuss: | |
| ======== | |
| Email: webp-discuss@webmproject.org | |
| Web: http://groups.google.com/a/webmproject.org/group/webp-discuss |