Add marhun photo webp compression compilers and implementations

This commit is contained in:
afiq.hamzah
2022-12-04 12:40:51 +08:00
parent a2525d5e66
commit 32dd54c707
144 changed files with 23635 additions and 19 deletions
+58 -5
View File
@@ -7,6 +7,7 @@ use Illuminate\Support\Facades\Storage;
use App\Models\FileMarhun;
use App\Models\LelongBid;
use Exception;
use Buglinjo\LaravelWebp\Facades\Webp;
class MarhunPhotoService
{
@@ -14,7 +15,6 @@ class MarhunPhotoService
public function store(Request $request)
{
try {
$file_type = $request->gambarMarhun->getClientOriginalExtension();
} catch (Exception $exception) {
@@ -38,15 +38,27 @@ class MarhunPhotoService
$photo_type_name = $request->photo_type === '1' ? 'overall_photo' : 'by_marhun_photo';
$directory = "/{$no_rujukan_sag}/{$photo_type_name}/";
$imageExtension = $request->file('gambarMarhun')->getClientOriginalExtension();
$imageExtension = $file_type;
$marhunImageFileName = "overall";
$marhunImageFileName = "overall.{$imageExtension}";
if (!empty($request->lelongbidmarhun_id)) {
$marhunImageFileName = "$request->lelongbidmarhun_id.$imageExtension";
$marhunImageFileName = "$request->lelongbidmarhun_id";
}
Storage::disk('marhun')->putFileAs($directory, $request->gambarMarhun, $marhunImageFileName);
Storage::disk('marhun')->putFileAs($directory, $request->gambarMarhun, "${marhunImageFileName}.${imageExtension}");
$stored_path = Storage::disk('marhun')->path("{$directory}{$marhunImageFileName}.${imageExtension}");
$convertedFilePath = $this->optimizeImageToWebP($stored_path, $directory, $marhunImageFileName);
$this->changeFileOwnerToServerUser($convertedFilePath);
Storage::disk('marhun')->delete("{$directory}${marhunImageFileName}.${imageExtension}");
$addfile->update([
'file_type' => 'webp',
]);
}
public function delete(Request $request)
@@ -109,6 +121,47 @@ class MarhunPhotoService
}
return Storage::disk('marhun')->get("{$directory}${marhunImageFileName}");
}
private function getWebpCompilerByOS()
{
$cwebp_compilers = [
'Windows' => 'binaries\libwebp-1.2.4-windows-x64\bin\cwebp',
'Linux' => 'binaries\libwebp-1.2.4-linux-x86-64\bin\cwebp',
];
$cwebp_compilers_darwin = [
'X86-64' => 'binaries\libwebp-1.2.4-mac-X86-64\bin\cwebp',
'arm64' => 'binaries\libwebp-1.2.4-mac-arm64\bin\cwebp',
];
$server_operating_system = explode(' ', trim(php_uname()))[0];
$server_processor_architecture = trim(php_uname('m'));
if (in_array($server_operating_system, array_keys($cwebp_compilers))) {
return resource_path($cwebp_compilers[$server_operating_system]);
}
if ($server_operating_system === 'Darwin') {
return resource_path($cwebp_compilers_darwin[$server_processor_architecture]);
}
}
private function optimizeImageToWebP($originalFilePath, $directory, $lelongbidmarhun_id)
{
$convertedFilePath = config('filesystems.disks.marhun.root') . '/' . "{$directory}{$lelongbidmarhun_id}.webp";
$webpCompiler = $this->getWebpCompilerByOS();
exec($webpCompiler . ' -q 60 ' . $originalFilePath . ' -o ' . $convertedFilePath);
return $convertedFilePath;
}
private function changeFileOwnerToServerUser($filepath)
{
chown($filepath, get_current_user());
}
}
+2
View File
@@ -7,6 +7,7 @@
"require": {
"php": "^7.3|^8.0",
"barryvdh/laravel-dompdf": "^0.9.0",
"buglinjo/laravel-webp": "^2.3",
"enlightn/enlightn": "^1.26",
"fruitcake/laravel-cors": "^2.0",
"guzzlehttp/guzzle": "^7.4",
@@ -18,6 +19,7 @@
"laravelcollective/html": "^6.3",
"php-http/guzzle7-adapter": "^1.0",
"pusher/pusher-php-server": "^7.0",
"spatie/laravel-image-optimizer": "^1.6",
"spatie/laravel-permission": "^5.3"
},
"require-dev": {
Generated
+190 -2
View File
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "2f10e37896fbd09e0db3f88edb605951",
"content-hash": "b693508e783afdca0b77c2e1dcf8217c",
"packages": [
{
"name": "asm89/stack-cors",
@@ -184,6 +184,71 @@
],
"time": "2021-08-15T20:50:18+00:00"
},
{
"name": "buglinjo/laravel-webp",
"version": "v2.3.1",
"source": {
"type": "git",
"url": "https://github.com/buglinjo/laravel-webp.git",
"reference": "8d28bad5dbb82d7257eb77f27b5c57daa0c0d6b8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/buglinjo/laravel-webp/zipball/8d28bad5dbb82d7257eb77f27b5c57daa0c0d6b8",
"reference": "8d28bad5dbb82d7257eb77f27b5c57daa0c0d6b8",
"shasum": ""
},
"require": {
"ext-gd": "*",
"laravel/framework": "~5.1|~6.0|~7.0|~8.0|~9.0",
"php": "^7.1|^8.0|^8.1"
},
"require-dev": {
"phpunit/phpunit": ">=5.4.3",
"squizlabs/php_codesniffer": "^2.3|^3.6"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Buglinjo\\LaravelWebp\\WebpServiceProvider"
],
"aliases": {
"Webp": "Buglinjo\\LaravelWebp\\Webp"
}
}
},
"autoload": {
"psr-4": {
"Buglinjo\\LaravelWebp\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Irakli Tchitadze",
"email": "irakli.tchitadze@gmail.com",
"homepage": "https://irakli.dev",
"role": "Developer"
}
],
"description": "Laravel package for WebP image formatting.",
"homepage": "https://github.com/buglinjo/laravel-webp",
"keywords": [
"Buglinjo",
"LaravelWebp",
"Webp",
"laravel"
],
"support": {
"issues": "https://github.com/buglinjo/laravel-webp/issues",
"source": "https://github.com/buglinjo/laravel-webp/tree/v2.3.1"
},
"time": "2022-03-15T01:49:23+00:00"
},
{
"name": "clue/stream-filter",
"version": "v1.6.0",
@@ -5760,6 +5825,129 @@
],
"time": "2022-07-20T18:31:45+00:00"
},
{
"name": "spatie/image-optimizer",
"version": "1.6.2",
"source": {
"type": "git",
"url": "https://github.com/spatie/image-optimizer.git",
"reference": "6db75529cbf8fa84117046a9d513f277aead90a0"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/spatie/image-optimizer/zipball/6db75529cbf8fa84117046a9d513f277aead90a0",
"reference": "6db75529cbf8fa84117046a9d513f277aead90a0",
"shasum": ""
},
"require": {
"ext-fileinfo": "*",
"php": "^7.3|^8.0",
"psr/log": "^1.0 | ^2.0 | ^3.0",
"symfony/process": "^4.2|^5.0|^6.0"
},
"require-dev": {
"phpunit/phpunit": "^8.5.21|^9.4.4",
"symfony/var-dumper": "^4.2|^5.0|^6.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Spatie\\ImageOptimizer\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Freek Van der Herten",
"email": "freek@spatie.be",
"homepage": "https://spatie.be",
"role": "Developer"
}
],
"description": "Easily optimize images using PHP",
"homepage": "https://github.com/spatie/image-optimizer",
"keywords": [
"image-optimizer",
"spatie"
],
"support": {
"issues": "https://github.com/spatie/image-optimizer/issues",
"source": "https://github.com/spatie/image-optimizer/tree/1.6.2"
},
"time": "2021-12-21T10:08:05+00:00"
},
{
"name": "spatie/laravel-image-optimizer",
"version": "1.6.4",
"source": {
"type": "git",
"url": "https://github.com/spatie/laravel-image-optimizer.git",
"reference": "c39e9ea77dee6b6eddfc26800adb1aa06a624294"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/spatie/laravel-image-optimizer/zipball/c39e9ea77dee6b6eddfc26800adb1aa06a624294",
"reference": "c39e9ea77dee6b6eddfc26800adb1aa06a624294",
"shasum": ""
},
"require": {
"laravel/framework": "^6.0|^7.0|^8.0",
"php": "^7.2|^8.0",
"spatie/image-optimizer": "^1.2.0"
},
"require-dev": {
"orchestra/testbench": "^4.0|^5.0|^6.0",
"phpunit/phpunit": "^9.0"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"Spatie\\LaravelImageOptimizer\\ImageOptimizerServiceProvider"
],
"aliases": {
"ImageOptimizer": "Spatie\\LaravelImageOptimizer\\Facades\\ImageOptimizer"
}
}
},
"autoload": {
"psr-4": {
"Spatie\\LaravelImageOptimizer\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Freek Van der Herten",
"email": "freek@spatie.be",
"homepage": "https://spatie.be",
"role": "Developer"
}
],
"description": "Optimize images in your Laravel app",
"homepage": "https://github.com/spatie/laravel-image-optimizer",
"keywords": [
"laravel-image-optimizer",
"spatie"
],
"support": {
"issues": "https://github.com/spatie/laravel-image-optimizer/issues",
"source": "https://github.com/spatie/laravel-image-optimizer/tree/1.6.4"
},
"funding": [
{
"url": "https://spatie.be/open-source/support-us",
"type": "custom"
}
],
"time": "2020-11-27T18:27:06+00:00"
},
{
"name": "spatie/laravel-permission",
"version": "5.5.16",
@@ -10786,5 +10974,5 @@
"php": "^7.3|^8.0"
},
"platform-dev": [],
"plugin-api-version": "1.1.0"
"plugin-api-version": "2.0.0"
}
+9 -9
View File
@@ -61,15 +61,15 @@ return [
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
// 'modes' => [
// //'ONLY_FULL_GROUP_BY', // Disable this to allow grouping by one column
// 'STRICT_TRANS_TABLES',
// 'NO_ZERO_IN_DATE',
// 'NO_ZERO_DATE',
// 'ERROR_FOR_DIVISION_BY_ZERO',
// 'NO_AUTO_CREATE_USER',
// 'NO_ENGINE_SUBSTITUTION'
// ],
'modes' => [
//'ONLY_FULL_GROUP_BY', // Disable this to allow grouping by one column
'STRICT_TRANS_TABLES',
'NO_ZERO_IN_DATE',
'NO_ZERO_DATE',
'ERROR_FOR_DIVISION_BY_ZERO',
'NO_AUTO_CREATE_USER',
'NO_ENGINE_SUBSTITUTION'
],
],
@@ -0,0 +1,29 @@
# How to Contribute
We'd love to accept your patches and contributions to this project. There are
just a few small guidelines you need to follow.
## Contributor License Agreement
Contributions to this project must be accompanied by a Contributor License
Agreement. You (or your employer) retain the copyright to your contribution;
this simply gives us permission to use and redistribute your contributions as
part of the project. Head over to <https://cla.developers.google.com/> to see
your current agreements on file or to sign a new one.
You generally only need to submit a CLA once, so if you've already submitted one
(even if it was for a different project), you probably don't need to do it
again.
## Code reviews
All submissions, including submissions by project members, require review. We
use a [Gerrit](https://www.gerritcodereview.com) instance hosted at
https://chromium-review.googlesource.com for this purpose. See the
[WebM Project page](https://www.webmproject.org/code/contribute/submitting-patches/)
for additional details.
## Community Guidelines
This project follows
[Google's Open Source Community Guidelines](https://opensource.google.com/conduct/).
@@ -0,0 +1,65 @@
# WebP Codec
```
__ __ ____ ____ ____
/ \\/ \/ _ \/ _ )/ _ \
\ / __/ _ \ __/
\__\__/\____/\_____/__/ ____ ___
/ _/ / \ \ / _ \/ _/
/ \_/ / / \ \ __/ \__
\____/____/\_____/_____/____/v1.2.4
```
WebP codec is a 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' to compress and decompress
images respectively.
See https://developers.google.com/speed/webp for details on the image format.
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
https://www.webmproject.org/license/software/ or the "COPYING" file for details.
An additional intellectual property rights grant can be found in the file
PATENTS.
## Files
* bin/cwebp : encoding tool
* bin/dwebp : decoding tool
* bin/gif2webp : gif conversion tool
* bin/img2webp : animation creation tool
* bin/vwebp : webp visualization tool
* bin/webpinfo : webp analysis tool
* bin/webpmux : webp muxing tool
* bin/anim\_diff : webp file comparison tool
* bin/anim\_dump : tool for dumping animation frames
* bin/get\_disto : tool for calculating file distortion
* bin/webp\_quality : webp quality estimation tool
* doc/ : manual in HTML and text formats
* lib/ : static libraries
* include/webp : headers
## Encoding and Decoding Tools
The bin/ directory contains tools to encode and decode images and animations,
view information about WebP images, and more. See the
[tools documentation](doc/tools.md).
## APIs
See the [APIs documentation](doc/api.md).
## Bugs
Please report all bugs to the issue tracker: https://bugs.chromium.org/p/webp
Patches welcome! See [how to contribute](CONTRIBUTING.md).
## Discuss
Email: webp-discuss@webmproject.org
Web: https://groups.google.com/a/webmproject.org/group/webp-discuss
@@ -0,0 +1,385 @@
# WebP APIs
## Encoding API
The main encoding functions are available in the header src/webp/encode.h
The ready-to-use ones are:
```c
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:
```c
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:
```c
#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 (!WebPPictureAlloc(&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);
```
## Decoding API
This is mainly just one function to call:
```c
#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:
```c
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:
```c
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:
```c
WebPIAppend(idec, fresh_data, size_of_fresh_data);
```
or by just mentioning the new size of the transmitted data:
```c
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.
```c
// 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);
```
## Webp Mux
WebPMux is a set of two libraries 'Mux' and 'Demux' for creation, extraction and
manipulation of an extended format WebP file, which can have features like color
profile, metadata and animation. Reference command-line tools `webpmux` and
`vwebp` as well as the WebP container specification
'doc/webp-container-spec.txt' are also provided in this package, see the
[tools documentation](tools.md).
### Mux API
The Mux API contains methods for adding data to and reading data from WebP
files. This API currently supports XMP/EXIF metadata, ICC profile and animation.
Other features may be added in subsequent releases.
Example#1 (pseudo code): Creating a WebPMux object with image data, color
profile and XMP metadata.
```c
int copy_data = 0;
WebPMux* mux = WebPMuxNew();
// ... (Prepare image data).
WebPMuxSetImage(mux, &image, copy_data);
// ... (Prepare ICC profile data).
WebPMuxSetChunk(mux, "ICCP", &icc_profile, copy_data);
// ... (Prepare XMP metadata).
WebPMuxSetChunk(mux, "XMP ", &xmp, copy_data);
// Get data from mux in WebP RIFF format.
WebPMuxAssemble(mux, &output_data);
WebPMuxDelete(mux);
// ... (Consume output_data; e.g. write output_data.bytes to file).
WebPDataClear(&output_data);
```
Example#2 (pseudo code): Get image and color profile data from a WebP file.
```c
int copy_data = 0;
// ... (Read data from file).
WebPMux* mux = WebPMuxCreate(&data, copy_data);
WebPMuxGetFrame(mux, 1, &image);
// ... (Consume image; e.g. call WebPDecode() to decode the data).
WebPMuxGetChunk(mux, "ICCP", &icc_profile);
// ... (Consume icc_profile).
WebPMuxDelete(mux);
free(data);
```
For a detailed Mux API reference, please refer to the header file
(src/webp/mux.h).
### Demux API
The Demux API enables extraction of images and extended format data from WebP
files. This API currently supports reading of XMP/EXIF metadata, ICC profile and
animated images. Other features may be added in subsequent releases.
Code example: Demuxing WebP data to extract all the frames, ICC profile and
EXIF/XMP metadata.
```c
WebPDemuxer* demux = WebPDemux(&webp_data);
uint32_t width = WebPDemuxGetI(demux, WEBP_FF_CANVAS_WIDTH);
uint32_t height = WebPDemuxGetI(demux, WEBP_FF_CANVAS_HEIGHT);
// ... (Get information about the features present in the WebP file).
uint32_t flags = WebPDemuxGetI(demux, WEBP_FF_FORMAT_FLAGS);
// ... (Iterate over all frames).
WebPIterator iter;
if (WebPDemuxGetFrame(demux, 1, &iter)) {
do {
// ... (Consume 'iter'; e.g. Decode 'iter.fragment' with WebPDecode(),
// ... and get other frame properties like width, height, offsets etc.
// ... see 'struct WebPIterator' below for more info).
} while (WebPDemuxNextFrame(&iter));
WebPDemuxReleaseIterator(&iter);
}
// ... (Extract metadata).
WebPChunkIterator chunk_iter;
if (flags & ICCP_FLAG) WebPDemuxGetChunk(demux, "ICCP", 1, &chunk_iter);
// ... (Consume the ICC profile in 'chunk_iter.chunk').
WebPDemuxReleaseChunkIterator(&chunk_iter);
if (flags & EXIF_FLAG) WebPDemuxGetChunk(demux, "EXIF", 1, &chunk_iter);
// ... (Consume the EXIF metadata in 'chunk_iter.chunk').
WebPDemuxReleaseChunkIterator(&chunk_iter);
if (flags & XMP_FLAG) WebPDemuxGetChunk(demux, "XMP ", 1, &chunk_iter);
// ... (Consume the XMP metadata in 'chunk_iter.chunk').
WebPDemuxReleaseChunkIterator(&chunk_iter);
WebPDemuxDelete(demux);
```
For a detailed Demux API reference, please refer to the header file
(src/webp/demux.h).
## AnimEncoder API
The AnimEncoder API can be used to create animated WebP images.
Code example:
```c
WebPAnimEncoderOptions enc_options;
WebPAnimEncoderOptionsInit(&enc_options);
// ... (Tune 'enc_options' as needed).
WebPAnimEncoder* enc = WebPAnimEncoderNew(width, height, &enc_options);
while(<there are more frames>) {
WebPConfig config;
WebPConfigInit(&config);
// ... (Tune 'config' as needed).
WebPAnimEncoderAdd(enc, frame, duration, &config);
}
WebPAnimEncoderAssemble(enc, webp_data);
WebPAnimEncoderDelete(enc);
// ... (Write the 'webp_data' to a file, or re-mux it further).
```
For a detailed AnimEncoder API reference, please refer to the header file
(src/webp/mux.h).
## AnimDecoder API
This AnimDecoder API allows decoding (possibly) animated WebP images.
Code Example:
```c
WebPAnimDecoderOptions dec_options;
WebPAnimDecoderOptionsInit(&dec_options);
// Tune 'dec_options' as needed.
WebPAnimDecoder* dec = WebPAnimDecoderNew(webp_data, &dec_options);
WebPAnimInfo anim_info;
WebPAnimDecoderGetInfo(dec, &anim_info);
for (uint32_t i = 0; i < anim_info.loop_count; ++i) {
while (WebPAnimDecoderHasMoreFrames(dec)) {
uint8_t* buf;
int timestamp;
WebPAnimDecoderGetNext(dec, &buf, &timestamp);
// ... (Render 'buf' based on 'timestamp').
// ... (Do NOT free 'buf', as it is owned by 'dec').
}
WebPAnimDecoderReset(dec);
}
const WebPDemuxer* demuxer = WebPAnimDecoderGetDemuxer(dec);
// ... (Do something using 'demuxer'; e.g. get EXIF/XMP/ICC data).
WebPAnimDecoderDelete(dec);
```
For a detailed AnimDecoder API reference, please refer to the header file
(src/webp/demux.h).
@@ -0,0 +1,635 @@
<!-- Creator : groff version 1.22.4 -->
<!-- CreationDate: Fri Aug 5 23:54:57 2022 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="generator" content="groff -Thtml, see www.gnu.org">
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<meta name="Content-Style" content="text/css">
<style type="text/css">
p { margin-top: 0; margin-bottom: 0; vertical-align: top }
pre { margin-top: 0; margin-bottom: 0; vertical-align: top }
table { margin-top: 0; margin-bottom: 0; vertical-align: top }
h1 { text-align: center }
</style>
<title>CWEBP</title>
</head>
<body>
<h1 align="center">CWEBP</h1>
<a href="#NAME">NAME</a><br>
<a href="#SYNOPSIS">SYNOPSIS</a><br>
<a href="#DESCRIPTION">DESCRIPTION</a><br>
<a href="#OPTIONS">OPTIONS</a><br>
<a href="#BUGS">BUGS</a><br>
<a href="#EXAMPLES">EXAMPLES</a><br>
<a href="#AUTHORS">AUTHORS</a><br>
<a href="#SEE ALSO">SEE ALSO</a><br>
<hr>
<h2>NAME
<a name="NAME"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">cwebp -
compress an image file to a WebP file</p>
<h2>SYNOPSIS
<a name="SYNOPSIS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em"><b>cwebp</b>
[<i>options</i>] <i>input_file -o output_file.webp</i></p>
<h2>DESCRIPTION
<a name="DESCRIPTION"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">This manual
page documents the <b>cwebp</b> command.</p>
<p style="margin-left:11%; margin-top: 1em"><b>cwebp</b>
compresses an image using the WebP format. Input format can
be either PNG, JPEG, TIFF, WebP or raw Y&rsquo;CbCr samples.
Note: Animated PNG and WebP files are not supported.</p>
<h2>OPTIONS
<a name="OPTIONS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">The basic
options are: <b><br>
-o</b> <i>string</i></p>
<p style="margin-left:22%;">Specify the name of the output
WebP file. If omitted, <b>cwebp</b> will perform compression
but only report statistics. Using &quot;-&quot; as output
name will direct output to &rsquo;stdout&rsquo;.</p>
<p style="margin-left:11%;"><b>--</b> <i>string</i></p>
<p style="margin-left:22%;">Explicitly specify the input
file. This option is useful if the input file starts with a
&rsquo;-&rsquo; for instance. This option must appear
<b>last</b>. Any other options afterward will be
ignored.</p>
<p style="margin-left:11%;"><b>-h, -help</b></p>
<p style="margin-left:22%;">A short usage summary.</p>
<p style="margin-left:11%;"><b>-H, -longhelp</b></p>
<p style="margin-left:22%;">A summary of all the possible
options.</p>
<p style="margin-left:11%;"><b>-version</b></p>
<p style="margin-left:22%;">Print the version number (as
major.minor.revision) and exit.</p>
<p style="margin-left:11%;"><b>-lossless</b></p>
<p style="margin-left:22%;">Encode the image without any
loss. For images with fully transparent area, the invisible
pixel values (R/G/B or Y/U/V) will be preserved only if the
-exact option is used.</p>
<p style="margin-left:11%;"><b>-near_lossless</b>
<i>int</i></p>
<p style="margin-left:22%;">Specify the level of
near-lossless image preprocessing. This option adjusts pixel
values to help compressibility, but has minimal impact on
the visual quality. It triggers lossless compression mode
automatically. The range is 0 (maximum preprocessing) to 100
(no preprocessing, the default). The typical value is around
60. Note that lossy with <b>-q 100</b> can at times yield
better results.</p>
<p style="margin-left:11%;"><b>-q</b> <i>float</i></p>
<p style="margin-left:22%;">Specify the compression factor
for RGB channels between 0 and 100. The default is 75. <br>
In case of lossy compression (default), a small factor
produces a smaller file with lower quality. Best quality is
achieved by using a value of 100. <br>
In case of lossless compression (specified by the
<b>-lossless</b> option), a small factor enables faster
compression speed, but produces a larger file. Maximum
compression is achieved by using a value of 100.</p>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p><b>-z</b> <i>int</i></p></td>
<td width="2%"></td>
<td width="78%">
<p>Switch on <b>lossless</b> compression mode with the
specified level between 0 and 9, with level 0 being the
fastest, 9 being the slowest. Fast mode produces larger file
size than slower ones. A good default is <b>-z 6</b>. This
option is actually a shortcut for some predefined settings
for quality and method. If options <b>-q</b> or <b>-m</b>
are subsequently used, they will invalidate the effect of
this option.</p></td></tr>
</table>
<p style="margin-left:11%;"><b>-alpha_q</b> <i>int</i></p>
<p style="margin-left:22%;">Specify the compression factor
for alpha compression between 0 and 100. Lossless
compression of alpha is achieved using a value of 100, while
the lower values result in a lossy compression. The default
is 100.</p>
<p style="margin-left:11%;"><b>-preset</b>
<i>string</i></p>
<p style="margin-left:22%;">Specify a set of pre-defined
parameters to suit a particular type of source material.
Possible values are: <b>default</b>, <b>photo</b>,
<b>picture</b>, <b>drawing</b>, <b>icon</b>, <b>text</b>.
Since <b>-preset</b> overwrites the other parameters&rsquo;
values (except the <b>-q</b> one), this option should
preferably appear first in the order of the arguments.</p>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p><b>-m</b> <i>int</i></p></td>
<td width="2%"></td>
<td width="78%">
<p>Specify the compression method to use. This parameter
controls the trade off between encoding speed and the
compressed file size and quality. Possible values range from
0 to 6. Default value is 4. When higher values are used, the
encoder will spend more time inspecting additional encoding
possibilities and decide on the quality gain. Lower value
can result in faster processing time at the expense of
larger file size and lower compression quality.</p></td></tr>
</table>
<p style="margin-left:11%;"><b>-crop</b> <i>x_position
y_position width height</i></p>
<p style="margin-left:22%;">Crop the source to a rectangle
with top-left corner at coordinates (<b>x_position</b>,
<b>y_position</b>) and size <b>width</b> x <b>height</b>.
This cropping area must be fully contained within the source
rectangle. Note: the cropping is applied <i>before</i> any
scaling.</p>
<p style="margin-left:11%;"><b>-resize</b> <i>width
height</i></p>
<p style="margin-left:22%;">Resize the source to a
rectangle with size <b>width</b> x <b>height</b>. If either
(but not both) of the <b>width</b> or <b>height</b>
parameters is 0, the value will be calculated preserving the
aspect-ratio. Note: scaling is applied <i>after</i>
cropping.</p>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="4%">
<p><b>-mt</b></p></td>
<td width="7%"></td>
<td width="70%">
<p>Use multi-threading for encoding, if possible.</p></td>
<td width="8%">
</td></tr>
</table>
<p style="margin-left:11%;"><b>-low_memory</b></p>
<p style="margin-left:22%;">Reduce memory usage of lossy
encoding by saving four times the compressed size
(typically). This will make the encoding slower and the
output slightly different in size and distortion. This flag
is only effective for methods 3 and up, and is off by
default. Note that leaving this flag off will have some side
effects on the bitstream: it forces certain bitstream
features like number of partitions (forced to 1). Note that
a more detailed report of bitstream size is printed by
<b>cwebp</b> when using this option.</p>
<p style="margin-left:11%; margin-top: 1em"><b>LOSSY
OPTIONS</b> <br>
These options are only effective when doing lossy encoding
(the default, with or without alpha). <b><br>
-size</b> <i>int</i></p>
<p style="margin-left:22%;">Specify a target size (in
bytes) to try and reach for the compressed output. The
compressor will make several passes of partial encoding in
order to get as close as possible to this target. If both
<b>-size</b> and <b>-psnr</b> are used, <b>-size</b> value
will prevail.</p>
<p style="margin-left:11%;"><b>-psnr</b> <i>float</i></p>
<p style="margin-left:22%;">Specify a target PSNR (in dB)
to try and reach for the compressed output. The compressor
will make several passes of partial encoding in order to get
as close as possible to this target. If both <b>-size</b>
and <b>-psnr</b> are used, <b>-size</b> value will
prevail.</p>
<p style="margin-left:11%;"><b>-pass</b> <i>int</i></p>
<p style="margin-left:22%;">Set a maximum number of passes
to use during the dichotomy used by options <b>-size</b> or
<b>-psnr</b>. Maximum value is 10, default is 1. If options
<b>-size</b> or <b>-psnr</b> were used, but <b>-pass</b>
wasn&rsquo;t specified, a default value of &rsquo;6&rsquo;
passes will be used.</p>
<p style="margin-left:11%;"><b>-qrange</b> <i>int
int</i></p>
<p style="margin-left:22%;">Specifies the permissible
interval for the quality factor. This is particularly useful
when using multi-pass (<b>-size</b> or <b>-psnr</b>
options). Default is 0 100. If the quality factor is outside
this range, it will be clamped. If the minimum value must be
less or equal to the maximum one.</p>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="4%">
<p><b>-af</b></p></td>
<td width="7%"></td>
<td width="78%">
<p>Turns auto-filter on. This algorithm will spend
additional time optimizing the filtering strength to reach a
well-balanced quality.</p></td></tr>
</table>
<p style="margin-left:11%;"><b>-jpeg_like</b></p>
<p style="margin-left:22%;">Change the internal parameter
mapping to better match the expected size of JPEG
compression. This flag will generally produce an output file
of similar size to its JPEG equivalent (for the same
<b>-q</b> setting), but with less visual distortion.</p>
<p style="margin-left:11%;">Advanced options:</p>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p><b>-f</b> <i>int</i></p></td>
<td width="2%"></td>
<td width="78%">
<p>Specify the strength of the deblocking filter, between 0
(no filtering) and 100 (maximum filtering). A value of 0
will turn off any filtering. Higher value will increase the
strength of the filtering process applied after decoding the
picture. The higher the value the smoother the picture will
appear. Typical values are usually in the range of 20 to
50.</p> </td></tr>
</table>
<p style="margin-left:11%;"><b>-sharpness</b>
<i>int</i></p>
<p style="margin-left:22%;">Specify the sharpness of the
filtering (if used). Range is 0 (sharpest) to 7 (least
sharp). Default is 0.</p>
<p style="margin-left:11%;"><b>-strong</b></p>
<p style="margin-left:22%;">Use strong filtering (if
filtering is being used thanks to the <b>-f</b> option).
Strong filtering is on by default.</p>
<p style="margin-left:11%;"><b>-nostrong</b></p>
<p style="margin-left:22%;">Disable strong filtering (if
filtering is being used thanks to the <b>-f</b> option) and
use simple filtering instead.</p>
<p style="margin-left:11%;"><b>-sharp_yuv</b></p>
<p style="margin-left:22%;">Use more accurate and sharper
RGB-&gt;YUV conversion if needed. Note that this process is
slower than the default &rsquo;fast&rsquo; RGB-&gt;YUV
conversion.</p>
<p style="margin-left:11%;"><b>-sns</b> <i>int</i></p>
<p style="margin-left:22%;">Specify the amplitude of the
spatial noise shaping. Spatial noise shaping (or <b>sns</b>
for short) refers to a general collection of built-in
algorithms used to decide which area of the picture should
use relatively less bits, and where else to better transfer
these bits. The possible range goes from 0 (algorithm is
off) to 100 (the maximal effect). The default value is
50.</p>
<p style="margin-left:11%;"><b>-segments</b> <i>int</i></p>
<p style="margin-left:22%;">Change the number of partitions
to use during the segmentation of the sns algorithm.
Segments should be in range 1 to 4. Default value is 4. This
option has no effect for methods 3 and up, unless
<b>-low_memory</b> is used.</p>
<p style="margin-left:11%;"><b>-partition_limit</b>
<i>int</i></p>
<p style="margin-left:22%;">Degrade quality by limiting the
number of bits used by some macroblocks. Range is 0 (no
degradation, the default) to 100 (full degradation). Useful
values are usually around 30-70 for moderately large images.
In the VP8 format, the so-called control partition has a
limit of 512k and is used to store the following
information: whether the macroblock is skipped, which
segment it belongs to, whether it is coded as intra 4x4 or
intra 16x16 mode, and finally the prediction modes to use
for each of the sub-blocks. For a very large image, 512k
only leaves room to few bits per 16x16 macroblock. The
absolute minimum is 4 bits per macroblock. Skip, segment,
and mode information can use up almost all these 4 bits
(although the case is unlikely), which is problematic for
very large images. The partition_limit factor controls how
frequently the most bit-costly mode (intra 4x4) will be
used. This is useful in case the 512k limit is reached and
the following message is displayed: <i>Error code: 6
(PARTITION0_OVERFLOW: Partition #0 is too big to fit
512k)</i>. If using <b>-partition_limit</b> is not enough to
meet the 512k constraint, one should use less segments in
order to save more header bits per macroblock. See the
<b>-segments</b> option.</p>
<p style="margin-left:11%; margin-top: 1em"><b>LOGGING
OPTIONS</b> <br>
These options control the level of output:</p>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="3%">
<p><b>-v</b></p></td>
<td width="8%"></td>
<td width="78%">
<p>Print extra information (encoding time in
particular).</p> </td></tr>
</table>
<p style="margin-left:11%;"><b>-print_psnr</b></p>
<p style="margin-left:22%;">Compute and report average PSNR
(Peak-Signal-To-Noise ratio).</p>
<p style="margin-left:11%;"><b>-print_ssim</b></p>
<p style="margin-left:22%;">Compute and report average SSIM
(structural similarity metric, see
https://en.wikipedia.org/wiki/SSIM for additional
details).</p>
<p style="margin-left:11%;"><b>-print_lsim</b></p>
<p style="margin-left:22%;">Compute and report local
similarity metric (sum of lowest error amongst the
collocated pixel neighbors).</p>
<p style="margin-left:11%;"><b>-progress</b></p>
<p style="margin-left:22%;">Report encoding progress in
percent.</p>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p><b>-quiet</b></p></td>
<td width="2%"></td>
<td width="78%">
<p>Do not print anything.</p></td></tr>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p><b>-short</b></p></td>
<td width="2%"></td>
<td width="78%">
<p>Only print brief information (output file size and PSNR)
for testing purposes.</p></td></tr>
</table>
<p style="margin-left:11%;"><b>-map</b> <i>int</i></p>
<p style="margin-left:22%;">Output additional ASCII-map of
encoding information. Possible map values range from 1 to 6.
This is only meant to help debugging.</p>
<p style="margin-left:11%; margin-top: 1em"><b>ADDITIONAL
OPTIONS</b> <br>
More advanced options are: <b><br>
-s</b> <i>width height</i></p>
<p style="margin-left:22%;">Specify that the input file
actually consists of raw Y&rsquo;CbCr samples following the
ITU-R BT.601 recommendation, in 4:2:0 linear format. The
luma plane has size <b>width</b> x <b>height</b>.</p>
<p style="margin-left:11%;"><b>-pre</b> <i>int</i></p>
<p style="margin-left:22%;">Specify some preprocessing
steps. Using a value of &rsquo;2&rsquo; will trigger
quality-dependent pseudo-random dithering during
RGBA-&gt;YUVA conversion (lossy compression only).</p>
<p style="margin-left:11%;"><b>-alpha_filter</b>
<i>string</i></p>
<p style="margin-left:22%;">Specify the predictive
filtering method for the alpha plane. One of
&rsquo;none&rsquo;, &rsquo;fast&rsquo; or
&rsquo;best&rsquo;, in increasing complexity and slowness
order. Default is &rsquo;fast&rsquo;. Internally, alpha
filtering is performed using four possible predictions
(none, horizontal, vertical, gradient). The
&rsquo;best&rsquo; mode will try each mode in turn and pick
the one which gives the smaller size. The &rsquo;fast&rsquo;
mode will just try to form an a priori guess without testing
all modes.</p>
<p style="margin-left:11%;"><b>-alpha_method</b>
<i>int</i></p>
<p style="margin-left:22%;">Specify the algorithm used for
alpha compression: 0 or 1. Algorithm 0 denotes no
compression, 1 uses WebP lossless format for compression.
The default is 1.</p>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p><b>-exact</b></p></td>
<td width="2%"></td>
<td width="78%">
<p>Preserve RGB values in transparent area. The default is
off, to help compressibility.</p></td></tr>
</table>
<p style="margin-left:11%;"><b>-blend_alpha</b>
<i>int</i></p>
<p style="margin-left:22%;">This option blends the alpha
channel (if present) with the source using the background
color specified in hexadecimal as 0xrrggbb. The alpha
channel is afterward reset to the opaque value 255.</p>
<p style="margin-left:11%;"><b>-noalpha</b></p>
<p style="margin-left:22%;">Using this option will discard
the alpha channel.</p>
<p style="margin-left:11%;"><b>-hint</b> <i>string</i></p>
<p style="margin-left:22%;">Specify the hint about input
image type. Possible values are: <b>photo</b>,
<b>picture</b> or <b>graph</b>.</p>
<p style="margin-left:11%;"><b>-metadata</b>
<i>string</i></p>
<p style="margin-left:22%;">A comma separated list of
metadata to copy from the input to the output if present.
Valid values: <b>all</b>, <b>none</b>, <b>exif</b>,
<b>icc</b>, <b>xmp</b>. The default is <b>none</b>.</p>
<p style="margin-left:22%; margin-top: 1em">Note: each
input format may not support all combinations.</p>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p><b>-noasm</b></p></td>
<td width="2%"></td>
<td width="53%">
<p>Disable all assembly optimizations.</p></td>
<td width="25%">
</td></tr>
</table>
<h2>BUGS
<a name="BUGS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">Please report
all bugs to the issue tracker:
https://bugs.chromium.org/p/webp <br>
Patches welcome! See this page to get started:
https://www.webmproject.org/code/contribute/submitting-patches/</p>
<h2>EXAMPLES
<a name="EXAMPLES"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">cwebp -q 50
-lossless picture.png -o picture_lossless.webp <br>
cwebp -q 70 picture_with_alpha.png -o
picture_with_alpha.webp <br>
cwebp -sns 70 -f 50 -size 60000 picture.png -o picture.webp
<br>
cwebp -o picture.webp -- ---picture.png</p>
<h2>AUTHORS
<a name="AUTHORS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em"><b>cwebp</b> is
a part of libwebp and was written by the WebP team. <br>
The latest source tree is available at
https://chromium.googlesource.com/webm/libwebp</p>
<p style="margin-left:11%; margin-top: 1em">This manual
page was written by Pascal Massimino
&lt;pascal.massimino@gmail.com&gt;, for the Debian project
(and may be used by others).</p>
<h2>SEE ALSO
<a name="SEE ALSO"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em"><b>dwebp</b>(1),
<b>gif2webp</b>(1) <br>
Please refer to https://developers.google.com/speed/webp/
for additional information.</p>
<hr>
</body>
</html>
@@ -0,0 +1,340 @@
CWEBP(1) General Commands Manual CWEBP(1)
NAME
cwebp - compress an image file to a WebP file
SYNOPSIS
cwebp [options] input_file -o output_file.webp
DESCRIPTION
This manual page documents the cwebp command.
cwebp compresses an image using the WebP format. Input format can be
either PNG, JPEG, TIFF, WebP or raw Y'CbCr samples. Note: Animated PNG
and WebP files are not supported.
OPTIONS
The basic options are:
-o string
Specify the name of the output WebP file. If omitted, cwebp will
perform compression but only report statistics. Using "-" as
output name will direct output to 'stdout'.
-- string
Explicitly specify the input file. This option is useful if the
input file starts with a '-' for instance. This option must ap-
pear last. Any other options afterward will be ignored.
-h, -help
A short usage summary.
-H, -longhelp
A summary of all the possible options.
-version
Print the version number (as major.minor.revision) and exit.
-lossless
Encode the image without any loss. For images with fully trans-
parent area, the invisible pixel values (R/G/B or Y/U/V) will be
preserved only if the -exact option is used.
-near_lossless int
Specify the level of near-lossless image preprocessing. This op-
tion adjusts pixel values to help compressibility, but has mini-
mal impact on the visual quality. It triggers lossless compres-
sion mode automatically. The range is 0 (maximum preprocessing)
to 100 (no preprocessing, the default). The typical value is
around 60. Note that lossy with -q 100 can at times yield better
results.
-q float
Specify the compression factor for RGB channels between 0 and
100. The default is 75.
In case of lossy compression (default), a small factor produces
a smaller file with lower quality. Best quality is achieved by
using a value of 100.
In case of lossless compression (specified by the -lossless op-
tion), a small factor enables faster compression speed, but pro-
duces a larger file. Maximum compression is achieved by using a
value of 100.
-z int Switch on lossless compression mode with the specified level be-
tween 0 and 9, with level 0 being the fastest, 9 being the slow-
est. Fast mode produces larger file size than slower ones. A
good default is -z 6. This option is actually a shortcut for
some predefined settings for quality and method. If options -q
or -m are subsequently used, they will invalidate the effect of
this option.
-alpha_q int
Specify the compression factor for alpha compression between 0
and 100. Lossless compression of alpha is achieved using a
value of 100, while the lower values result in a lossy compres-
sion. The default is 100.
-preset string
Specify a set of pre-defined parameters to suit a particular
type of source material. Possible values are: default, photo,
picture, drawing, icon, text. Since -preset overwrites the other
parameters' values (except the -q one), this option should
preferably appear first in the order of the arguments.
-m int Specify the compression method to use. This parameter controls
the trade off between encoding speed and the compressed file
size and quality. Possible values range from 0 to 6. Default
value is 4. When higher values are used, the encoder will spend
more time inspecting additional encoding possibilities and de-
cide on the quality gain. Lower value can result in faster pro-
cessing time at the expense of larger file size and lower com-
pression quality.
-crop x_position y_position width height
Crop the source to a rectangle with top-left corner at coordi-
nates (x_position, y_position) and size width x height. This
cropping area must be fully contained within the source rectan-
gle. Note: the cropping is applied before any scaling.
-resize width height
Resize the source to a rectangle with size width x height. If
either (but not both) of the width or height parameters is 0,
the value will be calculated preserving the aspect-ratio. Note:
scaling is applied after cropping.
-mt Use multi-threading for encoding, if possible.
-low_memory
Reduce memory usage of lossy encoding by saving four times the
compressed size (typically). This will make the encoding slower
and the output slightly different in size and distortion. This
flag is only effective for methods 3 and up, and is off by de-
fault. Note that leaving this flag off will have some side ef-
fects on the bitstream: it forces certain bitstream features
like number of partitions (forced to 1). Note that a more de-
tailed report of bitstream size is printed by cwebp when using
this option.
LOSSY OPTIONS
These options are only effective when doing lossy encoding (the de-
fault, with or without alpha).
-size int
Specify a target size (in bytes) to try and reach for the com-
pressed output. The compressor will make several passes of par-
tial encoding in order to get as close as possible to this tar-
get. If both -size and -psnr are used, -size value will prevail.
-psnr float
Specify a target PSNR (in dB) to try and reach for the com-
pressed output. The compressor will make several passes of par-
tial encoding in order to get as close as possible to this tar-
get. If both -size and -psnr are used, -size value will prevail.
-pass int
Set a maximum number of passes to use during the dichotomy used
by options -size or -psnr. Maximum value is 10, default is 1.
If options -size or -psnr were used, but -pass wasn't specified,
a default value of '6' passes will be used.
-qrange int int
Specifies the permissible interval for the quality factor. This
is particularly useful when using multi-pass (-size or -psnr op-
tions). Default is 0 100. If the quality factor is outside
this range, it will be clamped. If the minimum value must be
less or equal to the maximum one.
-af Turns auto-filter on. This algorithm will spend additional time
optimizing the filtering strength to reach a well-balanced qual-
ity.
-jpeg_like
Change the internal parameter mapping to better match the ex-
pected size of JPEG compression. This flag will generally pro-
duce an output file of similar size to its JPEG equivalent (for
the same -q setting), but with less visual distortion.
Advanced options:
-f int Specify the strength of the deblocking filter, between 0 (no
filtering) and 100 (maximum filtering). A value of 0 will turn
off any filtering. Higher value will increase the strength of
the filtering process applied after decoding the picture. The
higher the value the smoother the picture will appear. Typical
values are usually in the range of 20 to 50.
-sharpness int
Specify the sharpness of the filtering (if used). Range is 0
(sharpest) to 7 (least sharp). Default is 0.
-strong
Use strong filtering (if filtering is being used thanks to the
-f option). Strong filtering is on by default.
-nostrong
Disable strong filtering (if filtering is being used thanks to
the -f option) and use simple filtering instead.
-sharp_yuv
Use more accurate and sharper RGB->YUV conversion if needed.
Note that this process is slower than the default 'fast'
RGB->YUV conversion.
-sns int
Specify the amplitude of the spatial noise shaping. Spatial
noise shaping (or sns for short) refers to a general collection
of built-in algorithms used to decide which area of the picture
should use relatively less bits, and where else to better trans-
fer these bits. The possible range goes from 0 (algorithm is
off) to 100 (the maximal effect). The default value is 50.
-segments int
Change the number of partitions to use during the segmentation
of the sns algorithm. Segments should be in range 1 to 4. De-
fault value is 4. This option has no effect for methods 3 and
up, unless -low_memory is used.
-partition_limit int
Degrade quality by limiting the number of bits used by some mac-
roblocks. Range is 0 (no degradation, the default) to 100 (full
degradation). Useful values are usually around 30-70 for moder-
ately large images. In the VP8 format, the so-called control
partition has a limit of 512k and is used to store the following
information: whether the macroblock is skipped, which segment it
belongs to, whether it is coded as intra 4x4 or intra 16x16
mode, and finally the prediction modes to use for each of the
sub-blocks. For a very large image, 512k only leaves room to
few bits per 16x16 macroblock. The absolute minimum is 4 bits
per macroblock. Skip, segment, and mode information can use up
almost all these 4 bits (although the case is unlikely), which
is problematic for very large images. The partition_limit factor
controls how frequently the most bit-costly mode (intra 4x4)
will be used. This is useful in case the 512k limit is reached
and the following message is displayed: Error code: 6 (PARTI-
TION0_OVERFLOW: Partition #0 is too big to fit 512k). If using
-partition_limit is not enough to meet the 512k constraint, one
should use less segments in order to save more header bits per
macroblock. See the -segments option.
LOGGING OPTIONS
These options control the level of output:
-v Print extra information (encoding time in particular).
-print_psnr
Compute and report average PSNR (Peak-Signal-To-Noise ratio).
-print_ssim
Compute and report average SSIM (structural similarity metric,
see https://en.wikipedia.org/wiki/SSIM for additional details).
-print_lsim
Compute and report local similarity metric (sum of lowest error
amongst the collocated pixel neighbors).
-progress
Report encoding progress in percent.
-quiet Do not print anything.
-short Only print brief information (output file size and PSNR) for
testing purposes.
-map int
Output additional ASCII-map of encoding information. Possible
map values range from 1 to 6. This is only meant to help debug-
ging.
ADDITIONAL OPTIONS
More advanced options are:
-s width height
Specify that the input file actually consists of raw Y'CbCr sam-
ples following the ITU-R BT.601 recommendation, in 4:2:0 linear
format. The luma plane has size width x height.
-pre int
Specify some preprocessing steps. Using a value of '2' will
trigger quality-dependent pseudo-random dithering during
RGBA->YUVA conversion (lossy compression only).
-alpha_filter string
Specify the predictive filtering method for the alpha plane. One
of 'none', 'fast' or 'best', in increasing complexity and slow-
ness order. Default is 'fast'. Internally, alpha filtering is
performed using four possible predictions (none, horizontal,
vertical, gradient). The 'best' mode will try each mode in turn
and pick the one which gives the smaller size. The 'fast' mode
will just try to form an a priori guess without testing all
modes.
-alpha_method int
Specify the algorithm used for alpha compression: 0 or 1. Algo-
rithm 0 denotes no compression, 1 uses WebP lossless format for
compression. The default is 1.
-exact Preserve RGB values in transparent area. The default is off, to
help compressibility.
-blend_alpha int
This option blends the alpha channel (if present) with the
source using the background color specified in hexadecimal as
0xrrggbb. The alpha channel is afterward reset to the opaque
value 255.
-noalpha
Using this option will discard the alpha channel.
-hint string
Specify the hint about input image type. Possible values are:
photo, picture or graph.
-metadata string
A comma separated list of metadata to copy from the input to the
output if present. Valid values: all, none, exif, icc, xmp.
The default is none.
Note: each input format may not support all combinations.
-noasm Disable all assembly optimizations.
BUGS
Please report all bugs to the issue tracker:
https://bugs.chromium.org/p/webp
Patches welcome! See this page to get started: https://www.webmpro-
ject.org/code/contribute/submitting-patches/
EXAMPLES
cwebp -q 50 -lossless picture.png -o picture_lossless.webp
cwebp -q 70 picture_with_alpha.png -o picture_with_alpha.webp
cwebp -sns 70 -f 50 -size 60000 picture.png -o picture.webp
cwebp -o picture.webp -- ---picture.png
AUTHORS
cwebp is a part of libwebp and was written by the WebP team.
The latest source tree is available at https://chromium.google-
source.com/webm/libwebp
This manual page was written by Pascal Massimino <pascal.mas-
simino@gmail.com>, for the Debian project (and may be used by others).
SEE ALSO
dwebp(1), gif2webp(1)
Please refer to https://developers.google.com/speed/webp/ for addi-
tional information.
March 17, 2022 CWEBP(1)
@@ -0,0 +1,369 @@
<!-- Creator : groff version 1.22.4 -->
<!-- CreationDate: Fri Aug 5 23:54:57 2022 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="generator" content="groff -Thtml, see www.gnu.org">
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<meta name="Content-Style" content="text/css">
<style type="text/css">
p { margin-top: 0; margin-bottom: 0; vertical-align: top }
pre { margin-top: 0; margin-bottom: 0; vertical-align: top }
table { margin-top: 0; margin-bottom: 0; vertical-align: top }
h1 { text-align: center }
</style>
<title>DWEBP</title>
</head>
<body>
<h1 align="center">DWEBP</h1>
<a href="#NAME">NAME</a><br>
<a href="#SYNOPSIS">SYNOPSIS</a><br>
<a href="#DESCRIPTION">DESCRIPTION</a><br>
<a href="#OPTIONS">OPTIONS</a><br>
<a href="#BUGS">BUGS</a><br>
<a href="#EXAMPLES">EXAMPLES</a><br>
<a href="#AUTHORS">AUTHORS</a><br>
<a href="#SEE ALSO">SEE ALSO</a><br>
<hr>
<h2>NAME
<a name="NAME"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">dwebp -
decompress a WebP file to an image file</p>
<h2>SYNOPSIS
<a name="SYNOPSIS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em"><b>dwebp</b>
[<i>options</i>] <i>input_file.webp</i></p>
<h2>DESCRIPTION
<a name="DESCRIPTION"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">This manual
page documents the <b>dwebp</b> command.</p>
<p style="margin-left:11%; margin-top: 1em"><b>dwebp</b>
decompresses WebP files into PNG, PAM, PPM or PGM images.
Note: Animated WebP files are not supported.</p>
<h2>OPTIONS
<a name="OPTIONS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">The basic
options are:</p>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="3%">
<p><b>-h</b></p></td>
<td width="8%"></td>
<td width="30%">
<p>Print usage summary.</p></td>
<td width="48%">
</td></tr>
</table>
<p style="margin-left:11%;"><b>-version</b></p>
<p style="margin-left:22%;">Print the version number (as
major.minor.revision) and exit.</p>
<p style="margin-left:11%;"><b>-o</b> <i>string</i></p>
<p style="margin-left:22%;">Specify the name of the output
file (as PNG format by default). Using &quot;-&quot; as
output name will direct output to &rsquo;stdout&rsquo;.</p>
<p style="margin-left:11%;"><b>--</b> <i>string</i></p>
<p style="margin-left:22%;">Explicitly specify the input
file. This option is useful if the input file starts with an
&rsquo;-&rsquo; for instance. This option must appear
<b>last</b>. Any other options afterward will be ignored. If
the input file is &quot;-&quot;, the data will be read from
<i>stdin</i> instead of a file.</p>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="7%">
<p><b>-bmp</b></p></td>
<td width="4%"></td>
<td width="78%">
<p>Change the output format to uncompressed BMP.</p></td></tr>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="7%">
<p><b>-tiff</b></p></td>
<td width="4%"></td>
<td width="78%">
<p>Change the output format to uncompressed TIFF.</p></td></tr>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="7%">
<p><b>-pam</b></p></td>
<td width="4%"></td>
<td width="78%">
<p>Change the output format to PAM (retains alpha).</p></td></tr>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="7%">
<p><b>-ppm</b></p></td>
<td width="4%"></td>
<td width="78%">
<p>Change the output format to PPM (discards alpha).</p></td></tr>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="7%">
<p><b>-pgm</b></p></td>
<td width="4%"></td>
<td width="78%">
<p>Change the output format to PGM. The output consists of
luma/chroma samples instead of RGB, using the IMC4 layout.
This option is mainly for verification and debugging
purposes.</p> </td></tr>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="7%">
<p><b>-yuv</b></p></td>
<td width="4%"></td>
<td width="78%">
<p>Change the output format to raw YUV. The output consists
of luma/chroma-U/chroma-V samples instead of RGB, saved
sequentially as individual planes. This option is mainly for
verification and debugging purposes.</p></td></tr>
</table>
<p style="margin-left:11%;"><b>-nofancy</b></p>
<p style="margin-left:22%;">Don&rsquo;t use the fancy
upscaler for YUV420. This may lead to jaggy edges
(especially the red ones), but should be faster.</p>
<p style="margin-left:11%;"><b>-nofilter</b></p>
<p style="margin-left:22%;">Don&rsquo;t use the in-loop
filtering process even if it is required by the bitstream.
This may produce visible blocks on the non-compliant output,
but it will make the decoding faster.</p>
<p style="margin-left:11%;"><b>-dither</b>
<i>strength</i></p>
<p style="margin-left:22%;">Specify a dithering
<b>strength</b> between 0 and 100. Dithering is a
post-processing effect applied to chroma components in lossy
compression. It helps by smoothing gradients and avoiding
banding artifacts.</p>
<p style="margin-left:11%;"><b>-alpha_dither</b></p>
<p style="margin-left:22%;">If the compressed file contains
a transparency plane that was quantized during compression,
this flag will allow dithering the reconstructed plane in
order to generate smoother transparency gradients.</p>
<p style="margin-left:11%;"><b>-nodither</b></p>
<p style="margin-left:22%;">Disable all dithering
(default).</p>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="4%">
<p><b>-mt</b></p></td>
<td width="7%"></td>
<td width="70%">
<p>Use multi-threading for decoding, if possible.</p></td>
<td width="8%">
</td></tr>
</table>
<p style="margin-left:11%;"><b>-crop</b> <i>x_position
y_position width height</i></p>
<p style="margin-left:22%;">Crop the decoded picture to a
rectangle with top-left corner at coordinates
(<b>x_position</b>, <b>y_position</b>) and size <b>width</b>
x <b>height</b>. This cropping area must be fully contained
within the source rectangle. The top-left corner will be
snapped to even coordinates if needed. This option is meant
to reduce the memory needed for cropping large images. Note:
the cropping is applied <i>before</i> any scaling.</p>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="7%">
<p><b>-flip</b></p></td>
<td width="4%"></td>
<td width="78%">
<p>Flip decoded image vertically (can be useful for OpenGL
textures for instance).</p></td></tr>
</table>
<p style="margin-left:11%;"><b>-resize</b>, <b>-scale</b>
<i>width height</i></p>
<p style="margin-left:22%;">Rescale the decoded picture to
dimension <b>width</b> x <b>height</b>. This option is
mostly intended to reducing the memory needed to decode
large images, when only a small version is needed
(thumbnail, preview, etc.). Note: scaling is applied
<i>after</i> cropping. If either (but not both) of the
<b>width</b> or <b>height</b> parameters is 0, the value
will be calculated preserving the aspect-ratio.</p>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p><b>-quiet</b></p></td>
<td width="2%"></td>
<td width="78%">
<p>Do not print anything.</p></td></tr>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p><b>-v</b></p></td>
<td width="2%"></td>
<td width="78%">
<p>Print extra information (decoding time in
particular).</p> </td></tr>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p><b>-noasm</b></p></td>
<td width="2%"></td>
<td width="78%">
<p>Disable all assembly optimizations.</p></td></tr>
</table>
<h2>BUGS
<a name="BUGS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">Please report
all bugs to the issue tracker:
https://bugs.chromium.org/p/webp <br>
Patches welcome! See this page to get started:
https://www.webmproject.org/code/contribute/submitting-patches/</p>
<h2>EXAMPLES
<a name="EXAMPLES"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">dwebp
picture.webp -o output.png <br>
dwebp picture.webp -ppm -o output.ppm <br>
dwebp -o output.ppm -- ---picture.webp <br>
cat picture.webp | dwebp -o - -- - &gt; output.ppm</p>
<h2>AUTHORS
<a name="AUTHORS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em"><b>dwebp</b> is
a part of libwebp and was written by the WebP team. <br>
The latest source tree is available at
https://chromium.googlesource.com/webm/libwebp</p>
<p style="margin-left:11%; margin-top: 1em">This manual
page was written by Pascal Massimino
&lt;pascal.massimino@gmail.com&gt;, for the Debian project
(and may be used by others).</p>
<h2>SEE ALSO
<a name="SEE ALSO"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em"><b>cwebp</b>(1),
<b>gif2webp</b>(1), <b>webpmux</b>(1) <br>
Please refer to https://developers.google.com/speed/webp/
for additional information.</p>
<p style="margin-left:11%; margin-top: 1em"><b>Output file
format details</b> <br>
PAM: http://netpbm.sourceforge.net/doc/pam.html <br>
PGM: http://netpbm.sourceforge.net/doc/pgm.html <br>
PPM: http://netpbm.sourceforge.net/doc/ppm.html <br>
PNG: http://www.libpng.org/pub/png/png-sitemap.html#info</p>
<hr>
</body>
</html>
@@ -0,0 +1,142 @@
DWEBP(1) General Commands Manual DWEBP(1)
NAME
dwebp - decompress a WebP file to an image file
SYNOPSIS
dwebp [options] input_file.webp
DESCRIPTION
This manual page documents the dwebp command.
dwebp decompresses WebP files into PNG, PAM, PPM or PGM images. Note:
Animated WebP files are not supported.
OPTIONS
The basic options are:
-h Print usage summary.
-version
Print the version number (as major.minor.revision) and exit.
-o string
Specify the name of the output file (as PNG format by default).
Using "-" as output name will direct output to 'stdout'.
-- string
Explicitly specify the input file. This option is useful if the
input file starts with an '-' for instance. This option must ap-
pear last. Any other options afterward will be ignored. If the
input file is "-", the data will be read from stdin instead of a
file.
-bmp Change the output format to uncompressed BMP.
-tiff Change the output format to uncompressed TIFF.
-pam Change the output format to PAM (retains alpha).
-ppm Change the output format to PPM (discards alpha).
-pgm Change the output format to PGM. The output consists of
luma/chroma samples instead of RGB, using the IMC4 layout. This
option is mainly for verification and debugging purposes.
-yuv Change the output format to raw YUV. The output consists of
luma/chroma-U/chroma-V samples instead of RGB, saved sequen-
tially as individual planes. This option is mainly for verifica-
tion and debugging purposes.
-nofancy
Don't use the fancy upscaler for YUV420. This may lead to jaggy
edges (especially the red ones), but should be faster.
-nofilter
Don't use the in-loop filtering process even if it is required
by the bitstream. This may produce visible blocks on the non-
compliant output, but it will make the decoding faster.
-dither strength
Specify a dithering strength between 0 and 100. Dithering is a
post-processing effect applied to chroma components in lossy
compression. It helps by smoothing gradients and avoiding band-
ing artifacts.
-alpha_dither
If the compressed file contains a transparency plane that was
quantized during compression, this flag will allow dithering the
reconstructed plane in order to generate smoother transparency
gradients.
-nodither
Disable all dithering (default).
-mt Use multi-threading for decoding, if possible.
-crop x_position y_position width height
Crop the decoded picture to a rectangle with top-left corner at
coordinates (x_position, y_position) and size width x height.
This cropping area must be fully contained within the source
rectangle. The top-left corner will be snapped to even coordi-
nates if needed. This option is meant to reduce the memory
needed for cropping large images. Note: the cropping is applied
before any scaling.
-flip Flip decoded image vertically (can be useful for OpenGL textures
for instance).
-resize, -scale width height
Rescale the decoded picture to dimension width x height. This
option is mostly intended to reducing the memory needed to de-
code large images, when only a small version is needed (thumb-
nail, preview, etc.). Note: scaling is applied after cropping.
If either (but not both) of the width or height parameters is 0,
the value will be calculated preserving the aspect-ratio.
-quiet Do not print anything.
-v Print extra information (decoding time in particular).
-noasm Disable all assembly optimizations.
BUGS
Please report all bugs to the issue tracker:
https://bugs.chromium.org/p/webp
Patches welcome! See this page to get started: https://www.webmpro-
ject.org/code/contribute/submitting-patches/
EXAMPLES
dwebp picture.webp -o output.png
dwebp picture.webp -ppm -o output.ppm
dwebp -o output.ppm -- ---picture.webp
cat picture.webp | dwebp -o - -- - > output.ppm
AUTHORS
dwebp is a part of libwebp and was written by the WebP team.
The latest source tree is available at https://chromium.google-
source.com/webm/libwebp
This manual page was written by Pascal Massimino <pascal.mas-
simino@gmail.com>, for the Debian project (and may be used by others).
SEE ALSO
cwebp(1), gif2webp(1), webpmux(1)
Please refer to https://developers.google.com/speed/webp/ for addi-
tional information.
Output file format details
PAM: http://netpbm.sourceforge.net/doc/pam.html
PGM: http://netpbm.sourceforge.net/doc/pgm.html
PPM: http://netpbm.sourceforge.net/doc/ppm.html
PNG: http://www.libpng.org/pub/png/png-sitemap.html#info
November 17, 2021 DWEBP(1)
@@ -0,0 +1,327 @@
<!-- Creator : groff version 1.22.4 -->
<!-- CreationDate: Fri Aug 5 23:54:57 2022 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="generator" content="groff -Thtml, see www.gnu.org">
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<meta name="Content-Style" content="text/css">
<style type="text/css">
p { margin-top: 0; margin-bottom: 0; vertical-align: top }
pre { margin-top: 0; margin-bottom: 0; vertical-align: top }
table { margin-top: 0; margin-bottom: 0; vertical-align: top }
h1 { text-align: center }
</style>
<title>GIF2WEBP</title>
</head>
<body>
<h1 align="center">GIF2WEBP</h1>
<a href="#NAME">NAME</a><br>
<a href="#SYNOPSIS">SYNOPSIS</a><br>
<a href="#DESCRIPTION">DESCRIPTION</a><br>
<a href="#OPTIONS">OPTIONS</a><br>
<a href="#BUGS">BUGS</a><br>
<a href="#EXAMPLES">EXAMPLES</a><br>
<a href="#AUTHORS">AUTHORS</a><br>
<a href="#SEE ALSO">SEE ALSO</a><br>
<hr>
<h2>NAME
<a name="NAME"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">gif2webp -
Convert a GIF image to WebP</p>
<h2>SYNOPSIS
<a name="SYNOPSIS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em"><b>gif2webp</b>
[<i>options</i>] <i>input_file.gif -o
output_file.webp</i></p>
<h2>DESCRIPTION
<a name="DESCRIPTION"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">This manual
page documents the <b>gif2webp</b> command.</p>
<p style="margin-left:11%; margin-top: 1em"><b>gif2webp</b>
converts a GIF image to a WebP image.</p>
<h2>OPTIONS
<a name="OPTIONS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">The basic
options are: <b><br>
-o</b> <i>string</i></p>
<p style="margin-left:22%;">Specify the name of the output
WebP file. If omitted, <b>gif2webp</b> will perform
conversion but only report statistics. Using &quot;-&quot;
as output name will direct output to
&rsquo;stdout&rsquo;.</p>
<p style="margin-left:11%;"><b>--</b> <i>string</i></p>
<p style="margin-left:22%;">Explicitly specify the input
file. This option is useful if the input file starts with an
&rsquo;-&rsquo; for instance. This option must appear
<b>last</b>. Any other options afterward will be ignored. If
the input file is &quot;-&quot;, the data will be read from
<i>stdin</i> instead of a file.</p>
<p style="margin-left:11%;"><b>-h, -help</b></p>
<p style="margin-left:22%;">Usage information.</p>
<p style="margin-left:11%;"><b>-version</b></p>
<p style="margin-left:22%;">Print the version number (as
major.minor.revision) and exit.</p>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p><b>-lossy</b></p></td>
<td width="2%"></td>
<td width="78%">
<p>Encode the image using lossy compression.</p></td></tr>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p><b>-mixed</b></p></td>
<td width="2%"></td>
<td width="78%">
<p>Mixed compression mode: optimize compression of the
image by picking either lossy or lossless compression for
each frame heuristically.</p></td></tr>
</table>
<p style="margin-left:11%;"><b>-q</b> <i>float</i></p>
<p style="margin-left:22%;">Specify the compression factor
for RGB channels between 0 and 100. The default is 75. <br>
In case of lossless compression (default), a small factor
enables faster compression speed, but produces a larger
file. Maximum compression is achieved by using a value of
100. <br>
In case of lossy compression (specified by the -lossy
option), a small factor produces a smaller file with lower
quality. Best quality is achieved by using a value of
100.</p>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p><b>-m</b> <i>int</i></p></td>
<td width="2%"></td>
<td width="78%">
<p>Specify the compression method to use. This parameter
controls the trade off between encoding speed and the
compressed file size and quality. Possible values range from
0 to 6. Default value is 4. When higher values are used, the
encoder will spend more time inspecting additional encoding
possibilities and decide on the quality gain. Lower value
can result is faster processing time at the expense of
larger file size and lower compression quality.</p></td></tr>
</table>
<p style="margin-left:11%;"><b>-min_size</b></p>
<p style="margin-left:22%;">Encode image to achieve
smallest size. This disables key frame insertion and picks
the dispose method resulting in the smallest output for each
frame. It uses lossless compression by default, but can be
combined with -q, -m, -lossy or -mixed options.</p>
<p style="margin-left:11%;"><b>-kmin</b> <i>int</i> <b><br>
-kmax</b> <i>int</i></p>
<p style="margin-left:22%;">Specify the minimum and maximum
distance between consecutive key frames (independently
decodable frames) in the output animation. The tool will
insert some key frames into the output animation as needed
so that this criteria is satisfied. <br>
A &rsquo;kmax&rsquo; value of 0 will turn off insertion of
key frames. A &rsquo;kmax&rsquo; value of 1 will result in
all frames being key frames. &rsquo;kmin&rsquo; value is not
taken into account in both these special cases. Typical
values are in the range 3 to 30. Default values are kmin =
9, kmax = 17 for lossless compression and kmin = 3, kmax = 5
for lossy compression. <br>
These two options are relevant only for animated images with
large number of frames (&gt;50). <br>
When lower values are used, more frames will be converted to
key frames. This may lead to smaller number of frames
required to decode a frame on average, thereby improving the
decoding performance. But this may lead to slightly bigger
file sizes. Higher values may lead to worse decoding
performance, but smaller file sizes. <br>
Some restrictions: <br>
(i) kmin &lt; kmax, <br>
(ii) kmin &gt;= kmax / 2 + 1 and <br>
(iii) kmax - kmin &lt;= 30. <br>
If any of these restrictions are not met, they will be
enforced automatically.</p>
<p style="margin-left:11%;"><b>-metadata</b>
<i>string</i></p>
<p style="margin-left:22%;">A comma separated list of
metadata to copy from the input to the output if present.
Valid values: <b>all</b>, <b>none</b>, <b>icc</b>,
<b>xmp</b>. The default is <b>xmp</b>.</p>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p><b>-f</b> <i>int</i></p></td>
<td width="2%"></td>
<td width="78%">
<p>For lossy encoding only (specified by the -lossy
option). Specify the strength of the deblocking filter,
between 0 (no filtering) and 100 (maximum filtering). A
value of 0 will turn off any filtering. Higher value will
increase the strength of the filtering process applied after
decoding the picture. The higher the value the smoother the
picture will appear. Typical values are usually in the range
of 20 to 50.</p></td></tr>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p><b>-mt</b></p></td>
<td width="2%"></td>
<td width="78%">
<p>Use multi-threading for encoding, if possible.</p></td></tr>
</table>
<p style="margin-left:11%;"><b>-loop_compatibility</b></p>
<p style="margin-left:22%;">If enabled, handle the loop
information in a compatible fashion for Chrome version prior
to M62 (inclusive) and Firefox.</p>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p><b>-v</b></p></td>
<td width="2%"></td>
<td width="36%">
<p>Print extra information.</p></td>
<td width="42%">
</td></tr>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p><b>-quiet</b></p></td>
<td width="2%"></td>
<td width="36%">
<p>Do not print anything.</p></td>
<td width="42%">
</td></tr>
</table>
<h2>BUGS
<a name="BUGS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">Please report
all bugs to the issue tracker:
https://bugs.chromium.org/p/webp <br>
Patches welcome! See this page to get started:
https://www.webmproject.org/code/contribute/submitting-patches/</p>
<h2>EXAMPLES
<a name="EXAMPLES"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">gif2webp
picture.gif -o picture.webp <br>
gif2webp -q 70 picture.gif -o picture.webp <br>
gif2webp -lossy -m 3 picture.gif -o picture_lossy.webp <br>
gif2webp -lossy -f 50 picture.gif -o picture.webp <br>
gif2webp -q 70 -o picture.webp -- ---picture.gif <br>
cat picture.gif | gif2webp -o - -- - &gt; output.webp</p>
<h2>AUTHORS
<a name="AUTHORS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em"><b>gif2webp</b>
is a part of libwebp and was written by the WebP team. <br>
The latest source tree is available at
https://chromium.googlesource.com/webm/libwebp</p>
<p style="margin-left:11%; margin-top: 1em">This manual
page was written by Urvang Joshi &lt;urvang@google.com&gt;,
for the Debian project (and may be used by others).</p>
<h2>SEE ALSO
<a name="SEE ALSO"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em"><b>cwebp</b>(1),
<b>dwebp</b>(1), <b>webpmux</b>(1) <br>
Please refer to https://developers.google.com/speed/webp/
for additional information.</p>
<hr>
</body>
</html>
@@ -0,0 +1,152 @@
GIF2WEBP(1) General Commands Manual GIF2WEBP(1)
NAME
gif2webp - Convert a GIF image to WebP
SYNOPSIS
gif2webp [options] input_file.gif -o output_file.webp
DESCRIPTION
This manual page documents the gif2webp command.
gif2webp converts a GIF image to a WebP image.
OPTIONS
The basic options are:
-o string
Specify the name of the output WebP file. If omitted, gif2webp
will perform conversion but only report statistics. Using "-"
as output name will direct output to 'stdout'.
-- string
Explicitly specify the input file. This option is useful if the
input file starts with an '-' for instance. This option must ap-
pear last. Any other options afterward will be ignored. If the
input file is "-", the data will be read from stdin instead of a
file.
-h, -help
Usage information.
-version
Print the version number (as major.minor.revision) and exit.
-lossy Encode the image using lossy compression.
-mixed Mixed compression mode: optimize compression of the image by
picking either lossy or lossless compression for each frame
heuristically.
-q float
Specify the compression factor for RGB channels between 0 and
100. The default is 75.
In case of lossless compression (default), a small factor en-
ables faster compression speed, but produces a larger file. Max-
imum compression is achieved by using a value of 100.
In case of lossy compression (specified by the -lossy option), a
small factor produces a smaller file with lower quality. Best
quality is achieved by using a value of 100.
-m int Specify the compression method to use. This parameter controls
the trade off between encoding speed and the compressed file
size and quality. Possible values range from 0 to 6. Default
value is 4. When higher values are used, the encoder will spend
more time inspecting additional encoding possibilities and de-
cide on the quality gain. Lower value can result is faster pro-
cessing time at the expense of larger file size and lower com-
pression quality.
-min_size
Encode image to achieve smallest size. This disables key frame
insertion and picks the dispose method resulting in the smallest
output for each frame. It uses lossless compression by default,
but can be combined with -q, -m, -lossy or -mixed options.
-kmin int
-kmax int
Specify the minimum and maximum distance between consecutive key
frames (independently decodable frames) in the output animation.
The tool will insert some key frames into the output animation
as needed so that this criteria is satisfied.
A 'kmax' value of 0 will turn off insertion of key frames. A
'kmax' value of 1 will result in all frames being key frames.
'kmin' value is not taken into account in both these special
cases. Typical values are in the range 3 to 30. Default values
are kmin = 9, kmax = 17 for lossless compression and kmin = 3,
kmax = 5 for lossy compression.
These two options are relevant only for animated images with
large number of frames (>50).
When lower values are used, more frames will be converted to key
frames. This may lead to smaller number of frames required to
decode a frame on average, thereby improving the decoding per-
formance. But this may lead to slightly bigger file sizes.
Higher values may lead to worse decoding performance, but
smaller file sizes.
Some restrictions:
(i) kmin < kmax,
(ii) kmin >= kmax / 2 + 1 and
(iii) kmax - kmin <= 30.
If any of these restrictions are not met, they will be enforced
automatically.
-metadata string
A comma separated list of metadata to copy from the input to the
output if present. Valid values: all, none, icc, xmp. The de-
fault is xmp.
-f int For lossy encoding only (specified by the -lossy option). Spec-
ify the strength of the deblocking filter, between 0 (no filter-
ing) and 100 (maximum filtering). A value of 0 will turn off
any filtering. Higher value will increase the strength of the
filtering process applied after decoding the picture. The higher
the value the smoother the picture will appear. Typical values
are usually in the range of 20 to 50.
-mt Use multi-threading for encoding, if possible.
-loop_compatibility
If enabled, handle the loop information in a compatible fashion
for Chrome version prior to M62 (inclusive) and Firefox.
-v Print extra information.
-quiet Do not print anything.
BUGS
Please report all bugs to the issue tracker:
https://bugs.chromium.org/p/webp
Patches welcome! See this page to get started: https://www.webmpro-
ject.org/code/contribute/submitting-patches/
EXAMPLES
gif2webp picture.gif -o picture.webp
gif2webp -q 70 picture.gif -o picture.webp
gif2webp -lossy -m 3 picture.gif -o picture_lossy.webp
gif2webp -lossy -f 50 picture.gif -o picture.webp
gif2webp -q 70 -o picture.webp -- ---picture.gif
cat picture.gif | gif2webp -o - -- - > output.webp
AUTHORS
gif2webp is a part of libwebp and was written by the WebP team.
The latest source tree is available at https://chromium.google-
source.com/webm/libwebp
This manual page was written by Urvang Joshi <urvang@google.com>, for
the Debian project (and may be used by others).
SEE ALSO
cwebp(1), dwebp(1), webpmux(1)
Please refer to https://developers.google.com/speed/webp/ for addi-
tional information.
November 17, 2021 GIF2WEBP(1)
@@ -0,0 +1,242 @@
<!-- Creator : groff version 1.22.4 -->
<!-- CreationDate: Fri Aug 5 23:54:57 2022 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="generator" content="groff -Thtml, see www.gnu.org">
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<meta name="Content-Style" content="text/css">
<style type="text/css">
p { margin-top: 0; margin-bottom: 0; vertical-align: top }
pre { margin-top: 0; margin-bottom: 0; vertical-align: top }
table { margin-top: 0; margin-bottom: 0; vertical-align: top }
h1 { text-align: center }
</style>
<title>IMG2WEBP</title>
</head>
<body>
<h1 align="center">IMG2WEBP</h1>
<a href="#NAME">NAME</a><br>
<a href="#SYNOPSIS">SYNOPSIS</a><br>
<a href="#DESCRIPTION">DESCRIPTION</a><br>
<a href="#FILE-LEVEL OPTIONS">FILE-LEVEL OPTIONS</a><br>
<a href="#PER-FRAME OPTIONS">PER-FRAME OPTIONS</a><br>
<a href="#EXAMPLE">EXAMPLE</a><br>
<a href="#BUGS">BUGS</a><br>
<a href="#AUTHORS">AUTHORS</a><br>
<a href="#SEE ALSO">SEE ALSO</a><br>
<hr>
<h2>NAME
<a name="NAME"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">img2webp -
create animated WebP file from a sequence of input
images.</p>
<h2>SYNOPSIS
<a name="SYNOPSIS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em"><b>img2webp</b>
[file_options] [[frame_options] frame_file]... <b><br>
img2webp argument_file_name</b></p>
<h2>DESCRIPTION
<a name="DESCRIPTION"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">This manual
page documents the <b>img2webp</b> command.</p>
<p style="margin-left:11%; margin-top: 1em"><b>img2webp</b>
compresses a sequence of images using the animated WebP
format. Input images can either be PNG, JPEG, TIFF or WebP.
If a single file name (not starting with the character
&rsquo;-&rsquo;) is supplied as the argument, the command
line arguments are actually tokenized from this file. This
allows for easy scripting or using a large number of
arguments.</p>
<h2>FILE-LEVEL OPTIONS
<a name="FILE-LEVEL OPTIONS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">The file-level
options are applied at the beginning of the compression
process, before the input frames are read. <b><br>
-o</b> <i>string</i></p>
<p style="margin-left:22%;">Specify the name of the output
WebP file.</p>
<p style="margin-left:11%;"><b>-min_size</b></p>
<p style="margin-left:22%;">Encode images to achieve
smallest size. This disables key frame insertion and picks
the parameters resulting in the smallest output for each
frame. It uses lossless compression by default, but can be
combined with -q, -m, -lossy or -mixed options.</p>
<p style="margin-left:11%;"><b>-kmin</b> <i>int</i> <b><br>
-kmax</b> <i>int</i></p>
<p style="margin-left:22%;">Specify the minimum and maximum
distance between consecutive key frames (independently
decodable frames) in the output animation. The tool will
insert some key frames into the output animation as needed
so that this criteria is satisfied. <b><br>
-mixed</b> Mixed compression mode: optimize compression of
the image by picking either lossy or lossless compression
for each frame heuristically. This global option disables
the local option <b>-lossy</b> and <b>-lossless</b> .</p>
<p style="margin-left:11%;"><b>-loop</b> <i>int</i></p>
<p style="margin-left:22%;">Specifies the number of times
the animation should loop. Using &rsquo;0&rsquo; means
&rsquo;loop indefinitely&rsquo;.</p>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="3%">
<p><b>-v</b></p></td>
<td width="8%"></td>
<td width="24%">
<p>Be more verbose.</p></td>
<td width="54%">
</td></tr>
</table>
<p style="margin-left:11%;"><b>-h, -help</b></p>
<p style="margin-left:22%;">A short usage summary.</p>
<p style="margin-left:11%;"><b>-version</b></p>
<p style="margin-left:22%;">Print the version numbers of
the relevant libraries used.</p>
<h2>PER-FRAME OPTIONS
<a name="PER-FRAME OPTIONS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">The per-frame
options are applied for the images following as arguments in
the command line. They can be modified any number of times
preceding each particular input image.</p>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p><b>-d</b> <i>int</i></p></td>
<td width="2%"></td>
<td width="66%">
<p>Specify the image duration in milliseconds.</p></td>
<td width="12%">
</td></tr>
</table>
<p style="margin-left:11%;"><b>-lossless, -lossy</b></p>
<p style="margin-left:22%;">Compress the next image(s)
using lossless or lossy compression mode. The default mode
is lossless.</p>
<p style="margin-left:11%;"><b>-q</b> <i>float</i></p>
<p style="margin-left:22%;">Specify the compression factor
between 0 and 100. The default is 75.</p>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p><b>-m</b> <i>int</i></p></td>
<td width="2%"></td>
<td width="78%">
<p>Specify the compression method to use. This parameter
controls the trade off between encoding speed and the
compressed file size and quality. Possible values range from
0 to 6. Default value is 4.</p></td></tr>
</table>
<h2>EXAMPLE
<a name="EXAMPLE"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">img2webp -loop
2 in0.png -lossy in1.jpg -d 80 in2.tiff -o out.webp</p>
<h2>BUGS
<a name="BUGS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">Please report
all bugs to the issue tracker:
https://bugs.chromium.org/p/webp <br>
Patches welcome! See this page to get started:
https://www.webmproject.org/code/contribute/submitting-patches/</p>
<h2>AUTHORS
<a name="AUTHORS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em"><b>img2webp</b>
is a part of libwebp and was written by the WebP team. <br>
The latest source tree is available at
https://chromium.googlesource.com/webm/libwebp</p>
<p style="margin-left:11%; margin-top: 1em">This manual
page was written by Pascal Massimino
&lt;pascal.massimino@gmail.com&gt;, for the Debian project
(and may be used by others).</p>
<h2>SEE ALSO
<a name="SEE ALSO"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em"><b>webpmux</b>(1),
<b>gif2webp</b>(1) <br>
Please refer to https://developers.google.com/speed/webp/
for additional information.</p>
<hr>
</body>
</html>
@@ -0,0 +1,108 @@
IMG2WEBP(1) General Commands Manual IMG2WEBP(1)
NAME
img2webp - create animated WebP file from a sequence of input images.
SYNOPSIS
img2webp [file_options] [[frame_options] frame_file]...
img2webp argument_file_name
DESCRIPTION
This manual page documents the img2webp command.
img2webp compresses a sequence of images using the animated WebP for-
mat. Input images can either be PNG, JPEG, TIFF or WebP. If a single
file name (not starting with the character '-') is supplied as the ar-
gument, the command line arguments are actually tokenized from this
file. This allows for easy scripting or using a large number of argu-
ments.
FILE-LEVEL OPTIONS
The file-level options are applied at the beginning of the compression
process, before the input frames are read.
-o string
Specify the name of the output WebP file.
-min_size
Encode images to achieve smallest size. This disables key frame
insertion and picks the parameters resulting in the smallest
output for each frame. It uses lossless compression by default,
but can be combined with -q, -m, -lossy or -mixed options.
-kmin int
-kmax int
Specify the minimum and maximum distance between consecutive key
frames (independently decodable frames) in the output animation.
The tool will insert some key frames into the output animation
as needed so that this criteria is satisfied.
-mixed Mixed compression mode: optimize compression of the image
by picking either lossy or lossless compression for each frame
heuristically. This global option disables the local option
-lossy and -lossless .
-loop int
Specifies the number of times the animation should loop. Using
'0' means 'loop indefinitely'.
-v Be more verbose.
-h, -help
A short usage summary.
-version
Print the version numbers of the relevant libraries used.
PER-FRAME OPTIONS
The per-frame options are applied for the images following as arguments
in the command line. They can be modified any number of times preceding
each particular input image.
-d int Specify the image duration in milliseconds.
-lossless, -lossy
Compress the next image(s) using lossless or lossy compression
mode. The default mode is lossless.
-q float
Specify the compression factor between 0 and 100. The default is
75.
-m int Specify the compression method to use. This parameter controls
the trade off between encoding speed and the compressed file
size and quality. Possible values range from 0 to 6. Default
value is 4.
EXAMPLE
img2webp -loop 2 in0.png -lossy in1.jpg -d 80 in2.tiff -o out.webp
BUGS
Please report all bugs to the issue tracker:
https://bugs.chromium.org/p/webp
Patches welcome! See this page to get started: https://www.webmpro-
ject.org/code/contribute/submitting-patches/
AUTHORS
img2webp is a part of libwebp and was written by the WebP team.
The latest source tree is available at https://chromium.google-
source.com/webm/libwebp
This manual page was written by Pascal Massimino <pascal.mas-
simino@gmail.com>, for the Debian project (and may be used by others).
SEE ALSO
webpmux(1), gif2webp(1)
Please refer to https://developers.google.com/speed/webp/ for addi-
tional information.
January 5, 2022 IMG2WEBP(1)
@@ -0,0 +1,512 @@
# WebP tools
## Encoding tool
The examples/ directory contains tools for encoding (cwebp) and decoding (dwebp)
images.
The easiest use should look like:
```shell
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:
```shell
> 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. Note: Animated PNG and WebP files are not supported.
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)
-qrange <min> <max> .... specifies the permissible quality range
(default: 0 100)
-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:
```shell
cd examples
./dwebp test.webp -ppm -o test.ppm
diff test.ppm test_ref.ppm
```
The full list of options is available using -h:
```shell
> dwebp -h
Usage: dwebp in_file [options] [-o out_file]
```
Decodes the WebP image file to PNG format [Default]. Note: Animated WebP files
are not supported.
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> ......... resize 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:
```shell
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:
```shell
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
-usebgcolor .. display background color
-mt .......... use multi-threading
-info ........ print info
-h ........... this help message
```
Keyboard shortcuts:
```
'c' ................ toggle use of color profile
'b' ................ toggle background color display
'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)
1. Download qcms from Mozilla / Chromium:
https://hg.mozilla.org/mozilla-central/file/0e7639e3bdfb/gfx/qcms
https://source.chromium.org/chromium/chromium/src/+/main:third_party/qcms/;drc=d4a2f8e1ed461d8fc05ed88d1ae2dc94c9773825
2. Build and archive the source files as libqcms.a / qcms.lib
3. Update makefile.unix / Makefile.vc
1. Define WEBP_HAVE_QCMS
2. Update include / library paths to reference the qcms directory.
Build using makefile.unix / Makefile.vc:
```shell
$ 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:
```shell
img2webp [file_options] [[frame_options] frame_file]...
```
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`
Note: if a single file name is passed as the argument, the arguments will be
tokenized from this file. The file name must not start with the character '-'.
## 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:
```shell
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:
```shell
$ make -f makefile.unix examples/gif2webp
```
or using autoconf:
```shell
$ ./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:
```shell
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 installed, anim_diff can be built using
makefile.unix:
```shell
$ make -f makefile.unix examples/anim_diff
```
or using autoconf:
```shell
$ ./configure --enable-everything
$ make
```
## WebP Mux tool
The examples/ directory contains a tool (webpmux) for manipulating WebP files.
The webpmux tool can be used to create an extended format WebP file and also to
extract or strip relevant data from such a file.
A list of options is available using the -help command line flag:
```shell
> webpmux -help
Usage: webpmux -get GET_OPTIONS INPUT -o OUTPUT
webpmux -set SET_OPTIONS INPUT -o OUTPUT
webpmux -duration DURATION_OPTIONS [-duration ...]
INPUT -o OUTPUT
webpmux -strip STRIP_OPTIONS INPUT -o OUTPUT
webpmux -frame FRAME_OPTIONS [-frame...] [-loop LOOP_COUNT]
[-bgcolor BACKGROUND_COLOR] -o OUTPUT
webpmux -info INPUT
webpmux [-h|-help]
webpmux -version
webpmux argument_file_name
GET_OPTIONS:
Extract relevant data:
icc get ICC profile
exif get EXIF metadata
xmp get XMP metadata
frame n get nth frame
SET_OPTIONS:
Set color profile/metadata/parameters:
loop LOOP_COUNT set the loop count
bgcolor BACKGROUND_COLOR set the animation background color
icc file.icc set ICC profile
exif file.exif set EXIF metadata
xmp file.xmp set XMP metadata
where: 'file.icc' contains the ICC profile to be set,
'file.exif' contains the EXIF metadata to be set
'file.xmp' contains the XMP metadata to be set
DURATION_OPTIONS:
Set duration of selected frames:
duration set duration for all frames
duration,frame set duration of a particular frame
duration,start,end set duration of frames in the
interval [start,end])
where: 'duration' is the duration in milliseconds
'start' is the start frame index
'end' is the inclusive end frame index
The special 'end' value '0' means: last frame.
STRIP_OPTIONS:
Strip color profile/metadata:
icc strip ICC profile
exif strip EXIF metadata
xmp strip XMP metadata
FRAME_OPTIONS(i):
Create animation:
file_i +di[+xi+yi[+mi[bi]]]
where: 'file_i' is the i'th animation frame (WebP format),
'di' is the pause duration before next frame,
'xi','yi' specify the image offset for this frame,
'mi' is the dispose method for this frame (0 or 1),
'bi' is the blending method for this frame (+b or -b)
LOOP_COUNT:
Number of times to repeat the animation.
Valid range is 0 to 65535 [Default: 0 (infinite)].
BACKGROUND_COLOR:
Background color of the canvas.
A,R,G,B
where: 'A', 'R', 'G' and 'B' are integers in the range 0 to 255 specifying
the Alpha, Red, Green and Blue component values respectively
[Default: 255,255,255,255]
INPUT & OUTPUT are in WebP format.
Note: The nature of EXIF, XMP and ICC data is not checked and is assumed to be
valid.
Note: if a single file name is passed as the argument, the arguments will be
tokenized from this file. The file name must not start with the character '-'.
```
@@ -0,0 +1,282 @@
<!-- Creator : groff version 1.22.4 -->
<!-- CreationDate: Fri Aug 5 23:54:57 2022 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="generator" content="groff -Thtml, see www.gnu.org">
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<meta name="Content-Style" content="text/css">
<style type="text/css">
p { margin-top: 0; margin-bottom: 0; vertical-align: top }
pre { margin-top: 0; margin-bottom: 0; vertical-align: top }
table { margin-top: 0; margin-bottom: 0; vertical-align: top }
h1 { text-align: center }
</style>
<title>VWEBP</title>
</head>
<body>
<h1 align="center">VWEBP</h1>
<a href="#NAME">NAME</a><br>
<a href="#SYNOPSIS">SYNOPSIS</a><br>
<a href="#DESCRIPTION">DESCRIPTION</a><br>
<a href="#OPTIONS">OPTIONS</a><br>
<a href="#KEYBOARD SHORTCUTS">KEYBOARD SHORTCUTS</a><br>
<a href="#BUGS">BUGS</a><br>
<a href="#EXAMPLES">EXAMPLES</a><br>
<a href="#AUTHORS">AUTHORS</a><br>
<a href="#SEE ALSO">SEE ALSO</a><br>
<hr>
<h2>NAME
<a name="NAME"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">vwebp -
decompress a WebP file and display it in a window</p>
<h2>SYNOPSIS
<a name="SYNOPSIS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em"><b>vwebp</b>
[<i>options</i>] <i>input_file.webp</i></p>
<h2>DESCRIPTION
<a name="DESCRIPTION"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">This manual
page documents the <b>vwebp</b> command.</p>
<p style="margin-left:11%; margin-top: 1em"><b>vwebp</b>
decompresses a WebP file and displays it in a window using
OpenGL.</p>
<h2>OPTIONS
<a name="OPTIONS"></a>
</h2>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="3%">
<p style="margin-top: 1em"><b>-h</b></p></td>
<td width="8%"></td>
<td width="30%">
<p style="margin-top: 1em">Print usage summary.</p></td>
<td width="48%">
</td></tr>
</table>
<p style="margin-left:11%;"><b>-version</b></p>
<p style="margin-left:22%;">Print version number and
exit.</p>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p><b>-noicc</b></p></td>
<td width="2%"></td>
<td width="56%">
<p>Don&rsquo;t use the ICC profile if present.</p></td>
<td width="22%">
</td></tr>
</table>
<p style="margin-left:11%;"><b>-nofancy</b></p>
<p style="margin-left:22%;">Don&rsquo;t use the fancy
YUV420 upscaler.</p>
<p style="margin-left:11%;"><b>-nofilter</b></p>
<p style="margin-left:22%;">Disable in-loop filtering.</p>
<p style="margin-left:11%;"><b>-dither</b>
<i>strength</i></p>
<p style="margin-left:22%;">Specify a dithering
<b>strength</b> between 0 and 100. Dithering is a
post-processing effect applied to chroma components in lossy
compression. It helps by smoothing gradients and avoiding
banding artifacts. Default: 50.</p>
<p style="margin-left:11%;"><b>-noalphadither</b></p>
<p style="margin-left:22%;">By default, quantized
transparency planes are dithered during decompression, to
smooth the gradients. This flag will prevent this
dithering.</p>
<p style="margin-left:11%;"><b>-usebgcolor</b></p>
<p style="margin-left:22%;">Fill transparent areas with the
bitstream&rsquo;s own background color instead of
checkerboard only. Default is white for non-animated
images.</p>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="7%">
<p><b>-mt</b></p></td>
<td width="4%"></td>
<td width="78%">
<p>Use multi-threading for decoding, if possible.</p></td></tr>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="7%">
<p><b>-info</b></p></td>
<td width="4%"></td>
<td width="78%">
<p>Display image information on top of the decoded
image.</p> </td></tr>
</table>
<p style="margin-left:11%;"><b>--</b> <i>string</i></p>
<p style="margin-left:22%;">Explicitly specify the input
file. This option is useful if the input file starts with an
&rsquo;-&rsquo; for instance. This option must appear
<b>last</b>. Any other options afterward will be ignored. If
the input file is &quot;-&quot;, the data will be read from
<i>stdin</i> instead of a file.</p>
<h2>KEYBOARD SHORTCUTS
<a name="KEYBOARD SHORTCUTS"></a>
</h2>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="4%">
<p style="margin-top: 1em"><b>&rsquo;c&rsquo;</b></p></td>
<td width="7%"></td>
<td width="78%">
<p style="margin-top: 1em">Toggle use of color profile.</p></td></tr>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="4%">
<p><b>&rsquo;b&rsquo;</b></p></td>
<td width="7%"></td>
<td width="78%">
<p>Toggle display of background color.</p></td></tr>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="4%">
<p><b>&rsquo;i&rsquo;</b></p></td>
<td width="7%"></td>
<td width="78%">
<p>Overlay file information.</p></td></tr>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="4%">
<p><b>&rsquo;d&rsquo;</b></p></td>
<td width="7%"></td>
<td width="78%">
<p>Disable blending and disposal process, for debugging
purposes.</p> </td></tr>
</table>
<p style="margin-left:11%;"><b>&rsquo;q&rsquo; /
&rsquo;Q&rsquo; / ESC</b></p>
<p style="margin-left:22%;">Quit.</p>
<h2>BUGS
<a name="BUGS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">Please report
all bugs to the issue tracker:
https://bugs.chromium.org/p/webp <br>
Patches welcome! See this page to get started:
https://www.webmproject.org/code/contribute/submitting-patches/</p>
<h2>EXAMPLES
<a name="EXAMPLES"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">vwebp
picture.webp <br>
vwebp picture.webp -mt -dither 0 <br>
vwebp -- ---picture.webp</p>
<h2>AUTHORS
<a name="AUTHORS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em"><b>vwebp</b> is
a part of libwebp and was written by the WebP team. <br>
The latest source tree is available at
https://chromium.googlesource.com/webm/libwebp</p>
<p style="margin-left:11%; margin-top: 1em">This manual
page was written for the Debian project (and may be used by
others).</p>
<h2>SEE ALSO
<a name="SEE ALSO"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em"><b>dwebp</b>(1)
<br>
Please refer to https://developers.google.com/speed/webp/
for additional information.</p>
<hr>
</body>
</html>
@@ -0,0 +1,103 @@
VWEBP(1) General Commands Manual VWEBP(1)
NAME
vwebp - decompress a WebP file and display it in a window
SYNOPSIS
vwebp [options] input_file.webp
DESCRIPTION
This manual page documents the vwebp command.
vwebp decompresses a WebP file and displays it in a window using
OpenGL.
OPTIONS
-h Print usage summary.
-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 strength
Specify a dithering strength between 0 and 100. Dithering is a
post-processing effect applied to chroma components in lossy
compression. It helps by smoothing gradients and avoiding band-
ing artifacts. Default: 50.
-noalphadither
By default, quantized transparency planes are dithered during
decompression, to smooth the gradients. This flag will prevent
this dithering.
-usebgcolor
Fill transparent areas with the bitstream's own background color
instead of checkerboard only. Default is white for non-animated
images.
-mt Use multi-threading for decoding, if possible.
-info Display image information on top of the decoded image.
-- string
Explicitly specify the input file. This option is useful if the
input file starts with an '-' for instance. This option must ap-
pear last. Any other options afterward will be ignored. If the
input file is "-", the data will be read from stdin instead of a
file.
KEYBOARD SHORTCUTS
'c' Toggle use of color profile.
'b' Toggle display of background color.
'i' Overlay file information.
'd' Disable blending and disposal process, for debugging purposes.
'q' / 'Q' / ESC
Quit.
BUGS
Please report all bugs to the issue tracker:
https://bugs.chromium.org/p/webp
Patches welcome! See this page to get started: https://www.webmpro-
ject.org/code/contribute/submitting-patches/
EXAMPLES
vwebp picture.webp
vwebp picture.webp -mt -dither 0
vwebp -- ---picture.webp
AUTHORS
vwebp is a part of libwebp and was written by the WebP team.
The latest source tree is available at https://chromium.google-
source.com/webm/libwebp
This manual page was written for the Debian project (and may be used by
others).
SEE ALSO
dwebp(1)
Please refer to https://developers.google.com/speed/webp/ for addi-
tional information.
November 17, 2021 VWEBP(1)
@@ -0,0 +1,186 @@
<!-- Creator : groff version 1.22.4 -->
<!-- CreationDate: Fri Aug 5 23:54:58 2022 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="generator" content="groff -Thtml, see www.gnu.org">
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<meta name="Content-Style" content="text/css">
<style type="text/css">
p { margin-top: 0; margin-bottom: 0; vertical-align: top }
pre { margin-top: 0; margin-bottom: 0; vertical-align: top }
table { margin-top: 0; margin-bottom: 0; vertical-align: top }
h1 { text-align: center }
</style>
<title>WEBPINFO</title>
</head>
<body>
<h1 align="center">WEBPINFO</h1>
<a href="#NAME">NAME</a><br>
<a href="#SYNOPSIS">SYNOPSIS</a><br>
<a href="#DESCRIPTION">DESCRIPTION</a><br>
<a href="#OPTIONS">OPTIONS</a><br>
<a href="#INPUT">INPUT</a><br>
<a href="#BUGS">BUGS</a><br>
<a href="#EXAMPLES">EXAMPLES</a><br>
<a href="#AUTHORS">AUTHORS</a><br>
<a href="#SEE ALSO">SEE ALSO</a><br>
<hr>
<h2>NAME
<a name="NAME"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">webpinfo -
print out the chunk level structure of WebP files along with
basic integrity checks.</p>
<h2>SYNOPSIS
<a name="SYNOPSIS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em"><b>webpinfo</b>
<i>OPTIONS INPUT</i> <b><br>
webpinfo [-h|-help|-H|-longhelp]</b></p>
<h2>DESCRIPTION
<a name="DESCRIPTION"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">This manual
page documents the <b>webpinfo</b> command.</p>
<p style="margin-left:11%; margin-top: 1em"><b>webpinfo</b>
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.</p>
<h2>OPTIONS
<a name="OPTIONS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em"><b>-version</b></p>
<p style="margin-left:22%;">Print the version number (as
major.minor.revision) and exit.</p>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p><b>-quiet</b></p></td>
<td width="2%"></td>
<td width="58%">
<p>Do not show chunk parsing information.</p></td>
<td width="20%">
</td></tr>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p><b>-diag</b></p></td>
<td width="2%"></td>
<td width="58%">
<p>Show parsing error diagnosis.</p></td>
<td width="20%">
</td></tr>
</table>
<p style="margin-left:11%;"><b>-summary</b></p>
<p style="margin-left:22%;">Show chunk stats summary.</p>
<p style="margin-left:11%;"><b>-bitstream_info</b></p>
<p style="margin-left:22%;">Parse bitstream header.</p>
<p style="margin-left:11%;"><b>-h, -help</b></p>
<p style="margin-left:22%;">A short usage summary.</p>
<p style="margin-left:11%;"><b>-H, -longhelp</b></p>
<p style="margin-left:22%;">Detailed usage
instructions.</p>
<h2>INPUT
<a name="INPUT"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">Input files in
WebP format. Input files must come last, following options
(if any). There can be multiple input files.</p>
<h2>BUGS
<a name="BUGS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">Please report
all bugs to the issue tracker:
https://bugs.chromium.org/p/webp <br>
Patches welcome! See this page to get started:
https://www.webmproject.org/code/contribute/submitting-patches/</p>
<h2>EXAMPLES
<a name="EXAMPLES"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">webpinfo -h
<br>
webpinfo -diag -summary input_file.webp <br>
webpinfo -bitstream_info input_file_1.webp input_file_2.webp
<br>
webpinfo *.webp</p>
<h2>AUTHORS
<a name="AUTHORS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em"><b>webpinfo</b>
is a part of libwebp and was written by the WebP team. <br>
The latest source tree is available at
https://chromium.googlesource.com/webm/libwebp</p>
<p style="margin-left:11%; margin-top: 1em">This manual
page was written by Hui Su &lt;huisu@google.com&gt;, for the
Debian project (and may be used by others).</p>
<h2>SEE ALSO
<a name="SEE ALSO"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em"><b>webpmux</b>(1)
<br>
Please refer to https://developers.google.com/speed/webp/
for additional information.</p>
<hr>
</body>
</html>
@@ -0,0 +1,78 @@
WEBPINFO(1) General Commands Manual WEBPINFO(1)
NAME
webpinfo - print out the chunk level structure of WebP files along with
basic integrity checks.
SYNOPSIS
webpinfo OPTIONS INPUT
webpinfo [-h|-help|-H|-longhelp]
DESCRIPTION
This manual page documents the webpinfo command.
webpinfo can be used to print out the chunk level structure and bit-
stream header information of WebP files. It can also check if the files
are of valid WebP format.
OPTIONS
-version
Print the version number (as major.minor.revision) and exit.
-quiet Do not show chunk parsing information.
-diag Show parsing error diagnosis.
-summary
Show chunk stats summary.
-bitstream_info
Parse bitstream header.
-h, -help
A short usage summary.
-H, -longhelp
Detailed usage instructions.
INPUT
Input files in WebP format. Input files must come last, following op-
tions (if any). There can be multiple input files.
BUGS
Please report all bugs to the issue tracker:
https://bugs.chromium.org/p/webp
Patches welcome! See this page to get started: https://www.webmpro-
ject.org/code/contribute/submitting-patches/
EXAMPLES
webpinfo -h
webpinfo -diag -summary input_file.webp
webpinfo -bitstream_info input_file_1.webp input_file_2.webp
webpinfo *.webp
AUTHORS
webpinfo is a part of libwebp and was written by the WebP team.
The latest source tree is available at https://chromium.google-
source.com/webm/libwebp
This manual page was written by Hui Su <huisu@google.com>, for the De-
bian project (and may be used by others).
SEE ALSO
webpmux(1)
Please refer to https://developers.google.com/speed/webp/ for addi-
tional information.
November 17, 2021 WEBPINFO(1)
@@ -0,0 +1,434 @@
<!-- Creator : groff version 1.22.4 -->
<!-- CreationDate: Fri Aug 5 23:54:57 2022 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="generator" content="groff -Thtml, see www.gnu.org">
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<meta name="Content-Style" content="text/css">
<style type="text/css">
p { margin-top: 0; margin-bottom: 0; vertical-align: top }
pre { margin-top: 0; margin-bottom: 0; vertical-align: top }
table { margin-top: 0; margin-bottom: 0; vertical-align: top }
h1 { text-align: center }
</style>
<title>WEBPMUX</title>
</head>
<body>
<h1 align="center">WEBPMUX</h1>
<a href="#NAME">NAME</a><br>
<a href="#SYNOPSIS">SYNOPSIS</a><br>
<a href="#DESCRIPTION">DESCRIPTION</a><br>
<a href="#OPTIONS">OPTIONS</a><br>
<a href="#BUGS">BUGS</a><br>
<a href="#EXAMPLES">EXAMPLES</a><br>
<a href="#AUTHORS">AUTHORS</a><br>
<a href="#SEE ALSO">SEE ALSO</a><br>
<hr>
<h2>NAME
<a name="NAME"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">webpmux -
create animated WebP files from non-animated WebP images,
extract frames from animated WebP images, and manage
XMP/EXIF metadata and ICC profile.</p>
<h2>SYNOPSIS
<a name="SYNOPSIS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em"><b>webpmux
-get</b> <i>GET_OPTIONS INPUT</i> <b>-o</b> <i>OUTPUT</i>
<b><br>
webpmux -set</b> <i>SET_OPTIONS INPUT</i> <b>-o</b>
<i>OUTPUT</i> <b><br>
webpmux -strip</b> <i>STRIP_OPTIONS INPUT</i> <b>-o</b>
<i>OUTPUT</i> <b><br>
webpmux -frame</b> <i>FRAME_OPTIONS</i> <b>[ -frame ... ] [
-loop</b> <i>LOOP_COUNT</i> <b>]</b></p>
<p style="margin-left:23%;"><b>[ -bgcolor</b>
<i>BACKGROUND_COLOR</i> <b>] -o</b> <i>OUTPUT</i></p>
<p style="margin-left:11%;"><b>webpmux -duration</b>
<i>DURATION OPTIONS</i> <b>[ -duration ... ]</b>
<i>INPUT</i> <b>-o</b> <i>OUTPUT</i> <b><br>
webpmux -info</b> <i>INPUT</i> <b><br>
webpmux [-h|-help] <br>
webpmux -version <br>
webpmux argument_file_name</b></p>
<h2>DESCRIPTION
<a name="DESCRIPTION"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">This manual
page documents the <b>webpmux</b> command.</p>
<p style="margin-left:11%; margin-top: 1em"><b>webpmux</b>
can be used to create/extract from animated WebP files, as
well as to add/extract/strip XMP/EXIF metadata and ICC
profile. If a single file name (not starting with the
character &rsquo;-&rsquo;) is supplied as the argument, the
command line arguments are actually tokenized from this
file. This allows for easy scripting or using a large number
of arguments.</p>
<h2>OPTIONS
<a name="OPTIONS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em"><b>GET_OPTIONS
(-get):</b></p>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="6%">
<p><b>icc</b></p></td>
<td width="5%"></td>
<td width="27%">
<p>Get ICC profile.</p></td>
<td width="51%">
</td></tr>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="6%">
<p><b>exif</b></p></td>
<td width="5%"></td>
<td width="27%">
<p>Get EXIF metadata.</p></td>
<td width="51%">
</td></tr>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="6%">
<p><b>xmp</b></p></td>
<td width="5%"></td>
<td width="27%">
<p>Get XMP metadata.</p></td>
<td width="51%">
</td></tr>
</table>
<p style="margin-left:11%;"><b>frame</b> <i>n</i></p>
<p style="margin-left:22%;">Get nth frame from an animated
image. (n = 0 has a special meaning: last frame).</p>
<p style="margin-left:11%; margin-top: 1em"><b>SET_OPTIONS
(-set) <br>
loop</b> <i>loop_count</i></p>
<p style="margin-left:22%;">Set loop count on an animated
file.</p>
<p style="margin-left:11%; margin-top: 1em">Where:
&rsquo;loop_count&rsquo; must be in range [0, 65535].
<b><br>
bgcolor</b> <i>A,R,G,B</i></p>
<p style="margin-left:22%;">Set the background color of the
canvas on an animated file.</p>
<p style="margin-left:11%; margin-top: 1em">where:
&rsquo;A&rsquo;, &rsquo;R&rsquo;, &rsquo;G&rsquo; and
&rsquo;B&rsquo; are integers in the range 0 to 255
specifying the Alpha, Red, Green and Blue component values
respectively. <b><br>
icc</b> <i>file.icc</i></p>
<p style="margin-left:22%;">Set ICC profile.</p>
<p style="margin-left:11%; margin-top: 1em">Where:
&rsquo;file.icc&rsquo; contains the ICC profile to be set.
<b><br>
exif</b> <i>file.exif</i></p>
<p style="margin-left:22%;">Set EXIF metadata.</p>
<p style="margin-left:11%; margin-top: 1em">Where:
&rsquo;file.exif&rsquo; contains the EXIF metadata to be
set. <b><br>
xmp</b> <i>file.xmp</i></p>
<p style="margin-left:22%;">Set XMP metadata.</p>
<p style="margin-left:11%; margin-top: 1em">Where:
&rsquo;file.xmp&rsquo; contains the XMP metadata to be
set.</p>
<p style="margin-left:11%; margin-top: 1em"><b>STRIP_OPTIONS
(-strip)</b></p>
<table width="100%" border="0" rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="6%">
<p><b>icc</b></p></td>
<td width="5%"></td>
<td width="30%">
<p>Strip ICC profile.</p></td>
<td width="48%">
</td></tr>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="6%">
<p><b>exif</b></p></td>
<td width="5%"></td>
<td width="30%">
<p>Strip EXIF metadata.</p></td>
<td width="48%">
</td></tr>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="6%">
<p><b>xmp</b></p></td>
<td width="5%"></td>
<td width="30%">
<p>Strip XMP metadata.</p></td>
<td width="48%">
</td></tr>
</table>
<p style="margin-left:11%; margin-top: 1em"><b>DURATION_OPTIONS
(-duration)</b> <br>
Amend the duration of a specific interval of frames. This
option is only effective on animated WebP and has no effect
on a single-frame file. <i><br>
duration[,start[,end]]</i></p>
<p style="margin-left:22%;">Where: <b><br>
duration</b> is the duration for the interval in
milliseconds (mandatory). Must be non-negative. <b><br>
start</b> is the starting frame index of the interval
(optional). <b><br>
end</b> is the ending frame index (inclusive) of the
interval (optional).</p>
<p style="margin-left:11%;">The three typical usages of
this option are:</p>
<p style="margin-left:22%;"><b>-duration d</b> <br>
set the duration to &rsquo;d&rsquo; for the whole animation.
<b><br>
-duration d,f</b> <br>
set the duration of frame &rsquo;f&rsquo; to
&rsquo;d&rsquo;. <b><br>
-duration d,start,end</b> <br>
set the duration to &rsquo;d&rsquo; for the whole
[start,end] interval.</p>
<p style="margin-left:22%; margin-top: 1em">Note that the
frames outside of the [start, end] interval will <br>
remain untouched. <br>
The &rsquo;end&rsquo; value &rsquo;0&rsquo; has the special
meaning &rsquo;last frame of the animation&rsquo;.</p>
<p style="margin-left:11%;"><i>Reminder:</i></p>
<p style="margin-left:22%;">frame indexing starts at
&rsquo;1&rsquo;.</p>
<p style="margin-left:11%; margin-top: 1em"><b>FRAME_OPTIONS
(-frame)</b> <br>
Create an animated WebP file from multiple (non-animated)
WebP images. <i><br>
file_i +di[+xi+yi[+mi[bi]]]</i></p>
<p style="margin-left:22%;">Where: &rsquo;file_i&rsquo; is
the i&rsquo;th frame (WebP format),
&rsquo;xi&rsquo;,&rsquo;yi&rsquo; specify the image offset
for this frame, &rsquo;di&rsquo; is the pause duration
before next frame, &rsquo;mi&rsquo; is the dispose method
for this frame (0 for NONE or 1 for BACKGROUND) and
&rsquo;bi&rsquo; is the blending method for this frame (+b
for BLEND or -b for NO_BLEND). Argument &rsquo;bi&rsquo; can
be omitted and will default to +b (BLEND). Also,
&rsquo;mi&rsquo; can be omitted if &rsquo;bi&rsquo; is
omitted and will default to 0 (NONE). Finally, if
&rsquo;mi&rsquo; and &rsquo;bi&rsquo; are omitted then
&rsquo;xi&rsquo; and &rsquo;yi&rsquo; can be omitted and
will default to +0+0.</p>
<p style="margin-left:11%;"><b>-loop</b> <i>n</i></p>
<p style="margin-left:22%;">Loop the frames n number of
times. 0 indicates the frames should loop forever. Valid
range is 0 to 65535 [Default: 0 (infinite)].</p>
<p style="margin-left:11%;"><b>-bgcolor</b>
<i>A,R,G,B</i></p>
<p style="margin-left:22%;">Background color of the canvas.
<br>
where: &rsquo;A&rsquo;, &rsquo;R&rsquo;, &rsquo;G&rsquo; and
&rsquo;B&rsquo; are integers in the range 0 to 255
specifying the Alpha, Red, Green and Blue component values
respectively [Default: 255,255,255,255].</p>
<p style="margin-left:11%; margin-top: 1em"><b>INPUT</b>
<br>
Input file in WebP format.</p>
<p style="margin-left:11%; margin-top: 1em"><b>OUTPUT
(-o)</b> <br>
Output file in WebP format.</p>
<p style="margin-left:11%; margin-top: 1em"><b>Note:</b>
<br>
The nature of EXIF, XMP and ICC data is not checked and is
assumed to <br>
be valid.</p>
<h2>BUGS
<a name="BUGS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">Please report
all bugs to the issue tracker:
https://bugs.chromium.org/p/webp <br>
Patches welcome! See this page to get started:
https://www.webmproject.org/code/contribute/submitting-patches/</p>
<h2>EXAMPLES
<a name="EXAMPLES"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em">Add ICC
profile: <br>
webpmux -set icc image_profile.icc in.webp -o
icc_container.webp</p>
<p style="margin-left:11%; margin-top: 1em">Extract ICC
profile: <br>
webpmux -get icc icc_container.webp -o image_profile.icc</p>
<p style="margin-left:11%; margin-top: 1em">Strip ICC
profile: <br>
webpmux -strip icc icc_container.webp -o
without_icc.webp</p>
<p style="margin-left:11%; margin-top: 1em">Add XMP
metadata: <br>
webpmux -set xmp image_metadata.xmp in.webp -o
xmp_container.webp</p>
<p style="margin-left:11%; margin-top: 1em">Extract XMP
metadata: <br>
webpmux -get xmp xmp_container.webp -o
image_metadata.xmp</p>
<p style="margin-left:11%; margin-top: 1em">Strip XMP
metadata: <br>
webpmux -strip xmp xmp_container.webp -o
without_xmp.webp</p>
<p style="margin-left:11%; margin-top: 1em">Add EXIF
metadata: <br>
webpmux -set exif image_metadata.exif in.webp -o
exif_container.webp</p>
<p style="margin-left:11%; margin-top: 1em">Extract EXIF
metadata: <br>
webpmux -get exif exif_container.webp -o
image_metadata.exif</p>
<p style="margin-left:11%; margin-top: 1em">Strip EXIF
metadata: <br>
webpmux -strip exif exif_container.webp -o
without_exif.webp</p>
<p style="margin-left:11%; margin-top: 1em">Create an
animated WebP file from 3 (non-animated) WebP images: <br>
webpmux -frame 1.webp +100 -frame 2.webp +100+50+50</p>
<p style="margin-left:23%;">-frame 3.webp +100+50+50+1+b
-loop 10 -bgcolor 255,255,255,255 <br>
-o anim_container.webp</p>
<p style="margin-left:11%; margin-top: 1em">Get the 2nd
frame from an animated WebP file: <br>
webpmux -get frame 2 anim_container.webp -o frame_2.webp</p>
<p style="margin-left:11%; margin-top: 1em">Using
-get/-set/-strip with input file name starting with
&rsquo;-&rsquo;: <br>
webpmux -set icc image_profile.icc -o icc_container.webp --
---in.webp <br>
webpmux -get icc -o image_profile.icc --
---icc_container.webp <br>
webpmux -strip icc -o without_icc.webp --
---icc_container.webp</p>
<h2>AUTHORS
<a name="AUTHORS"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em"><b>webpmux</b>
is a part of libwebp and was written by the WebP team. <br>
The latest source tree is available at
https://chromium.googlesource.com/webm/libwebp</p>
<p style="margin-left:11%; margin-top: 1em">This manual
page was written by Vikas Arora
&lt;vikaas.arora@gmail.com&gt;, for the Debian project (and
may be used by others).</p>
<h2>SEE ALSO
<a name="SEE ALSO"></a>
</h2>
<p style="margin-left:11%; margin-top: 1em"><b>cwebp</b>(1),
<b>dwebp</b>(1), <b>gif2webp</b>(1) <br>
Please refer to https://developers.google.com/speed/webp/
for additional information.</p>
<hr>
</body>
</html>
@@ -0,0 +1,216 @@
WEBPMUX(1) General Commands Manual WEBPMUX(1)
NAME
webpmux - create animated WebP files from non-animated WebP images, ex-
tract frames from animated WebP images, and manage XMP/EXIF metadata
and ICC profile.
SYNOPSIS
webpmux -get GET_OPTIONS INPUT -o OUTPUT
webpmux -set SET_OPTIONS INPUT -o OUTPUT
webpmux -strip STRIP_OPTIONS INPUT -o OUTPUT
webpmux -frame FRAME_OPTIONS [ -frame ... ] [ -loop LOOP_COUNT ]
[ -bgcolor BACKGROUND_COLOR ] -o OUTPUT
webpmux -duration DURATION OPTIONS [ -duration ... ] INPUT -o OUTPUT
webpmux -info INPUT
webpmux [-h|-help]
webpmux -version
webpmux argument_file_name
DESCRIPTION
This manual page documents the webpmux command.
webpmux can be used to create/extract from animated WebP files, as well
as to add/extract/strip XMP/EXIF metadata and ICC profile. If a single
file name (not starting with the character '-') is supplied as the ar-
gument, the command line arguments are actually tokenized from this
file. This allows for easy scripting or using a large number of argu-
ments.
OPTIONS
GET_OPTIONS (-get):
icc Get ICC profile.
exif Get EXIF metadata.
xmp Get XMP metadata.
frame n
Get nth frame from an animated image. (n = 0 has a special mean-
ing: last frame).
SET_OPTIONS (-set)
loop loop_count
Set loop count on an animated file.
Where: 'loop_count' must be in range [0, 65535].
bgcolor A,R,G,B
Set the background color of the canvas on an animated file.
where: 'A', 'R', 'G' and 'B' are integers in the range 0 to 255 speci-
fying the Alpha, Red, Green and Blue component values respectively.
icc file.icc
Set ICC profile.
Where: 'file.icc' contains the ICC profile to be set.
exif file.exif
Set EXIF metadata.
Where: 'file.exif' contains the EXIF metadata to be set.
xmp file.xmp
Set XMP metadata.
Where: 'file.xmp' contains the XMP metadata to be set.
STRIP_OPTIONS (-strip)
icc Strip ICC profile.
exif Strip EXIF metadata.
xmp Strip XMP metadata.
DURATION_OPTIONS (-duration)
Amend the duration of a specific interval of frames. This option is
only effective on animated WebP and has no effect on a single-frame
file.
duration[,start[,end]]
Where:
duration is the duration for the interval in milliseconds
(mandatory). Must be non-negative.
start is the starting frame index of the interval (optional).
end is the ending frame index (inclusive) of the interval (op-
tional).
The three typical usages of this option are:
-duration d
set the duration to 'd' for the whole animation.
-duration d,f
set the duration of frame 'f' to 'd'.
-duration d,start,end
set the duration to 'd' for the whole [start,end] interval.
Note that the frames outside of the [start, end] interval will
remain untouched.
The 'end' value '0' has the special meaning 'last frame of the
animation'.
Reminder:
frame indexing starts at '1'.
FRAME_OPTIONS (-frame)
Create an animated WebP file from multiple (non-animated) WebP images.
file_i +di[+xi+yi[+mi[bi]]]
Where: 'file_i' is the i'th frame (WebP format), 'xi','yi' spec-
ify the image offset for this frame, 'di' is the pause duration
before next frame, 'mi' is the dispose method for this frame (0
for NONE or 1 for BACKGROUND) and 'bi' is the blending method
for this frame (+b for BLEND or -b for NO_BLEND). Argument 'bi'
can be omitted and will default to +b (BLEND). Also, 'mi' can
be omitted if 'bi' is omitted and will default to 0 (NONE). Fi-
nally, if 'mi' and 'bi' are omitted then 'xi' and 'yi' can be
omitted and will default to +0+0.
-loop n
Loop the frames n number of times. 0 indicates the frames should
loop forever. Valid range is 0 to 65535 [Default: 0 (infi-
nite)].
-bgcolor A,R,G,B
Background color of the canvas.
where: 'A', 'R', 'G' and 'B' are integers in the range 0 to 255
specifying the Alpha, Red, Green and Blue component values re-
spectively [Default: 255,255,255,255].
INPUT
Input file in WebP format.
OUTPUT (-o)
Output file in WebP format.
Note:
The nature of EXIF, XMP and ICC data is not checked and is assumed to
be valid.
BUGS
Please report all bugs to the issue tracker:
https://bugs.chromium.org/p/webp
Patches welcome! See this page to get started: https://www.webmpro-
ject.org/code/contribute/submitting-patches/
EXAMPLES
Add ICC profile:
webpmux -set icc image_profile.icc in.webp -o icc_container.webp
Extract ICC profile:
webpmux -get icc icc_container.webp -o image_profile.icc
Strip ICC profile:
webpmux -strip icc icc_container.webp -o without_icc.webp
Add XMP metadata:
webpmux -set xmp image_metadata.xmp in.webp -o xmp_container.webp
Extract XMP metadata:
webpmux -get xmp xmp_container.webp -o image_metadata.xmp
Strip XMP metadata:
webpmux -strip xmp xmp_container.webp -o without_xmp.webp
Add EXIF metadata:
webpmux -set exif image_metadata.exif in.webp -o exif_container.webp
Extract EXIF metadata:
webpmux -get exif exif_container.webp -o image_metadata.exif
Strip EXIF metadata:
webpmux -strip exif exif_container.webp -o without_exif.webp
Create an animated WebP file from 3 (non-animated) WebP images:
webpmux -frame 1.webp +100 -frame 2.webp +100+50+50
-frame 3.webp +100+50+50+1+b -loop 10 -bgcolor 255,255,255,255
-o anim_container.webp
Get the 2nd frame from an animated WebP file:
webpmux -get frame 2 anim_container.webp -o frame_2.webp
Using -get/-set/-strip with input file name starting with '-':
webpmux -set icc image_profile.icc -o icc_container.webp -- ---in.webp
webpmux -get icc -o image_profile.icc -- ---icc_container.webp
webpmux -strip icc -o without_icc.webp -- ---icc_container.webp
AUTHORS
webpmux is a part of libwebp and was written by the WebP team.
The latest source tree is available at https://chromium.google-
source.com/webm/libwebp
This manual page was written by Vikas Arora <vikaas.arora@gmail.com>,
for the Debian project (and may be used by others).
SEE ALSO
cwebp(1), dwebp(1), gif2webp(1)
Please refer to https://developers.google.com/speed/webp/ for addi-
tional information.
November 17, 2021 WEBPMUX(1)
@@ -0,0 +1,503 @@
// Copyright 2010 Google Inc. All Rights Reserved.
//
// Use of this source code is governed by a BSD-style license
// that can be found in the COPYING file in the root of the source
// tree. An additional intellectual property rights grant can be found
// in the file PATENTS. All contributing project authors may
// be found in the AUTHORS file in the root of the source tree.
// -----------------------------------------------------------------------------
//
// Main decoding functions for WebP images.
//
// Author: Skal (pascal.massimino@gmail.com)
#ifndef WEBP_WEBP_DECODE_H_
#define WEBP_WEBP_DECODE_H_
#include "./types.h"
#ifdef __cplusplus
extern "C" {
#endif
#define WEBP_DECODER_ABI_VERSION 0x0209 // MAJOR(8b) + MINOR(8b)
// Note: forward declaring enumerations is not allowed in (strict) C and C++,
// the types are left here for reference.
// typedef enum VP8StatusCode VP8StatusCode;
// typedef enum WEBP_CSP_MODE WEBP_CSP_MODE;
typedef struct WebPRGBABuffer WebPRGBABuffer;
typedef struct WebPYUVABuffer WebPYUVABuffer;
typedef struct WebPDecBuffer WebPDecBuffer;
typedef struct WebPIDecoder WebPIDecoder;
typedef struct WebPBitstreamFeatures WebPBitstreamFeatures;
typedef struct WebPDecoderOptions WebPDecoderOptions;
typedef struct WebPDecoderConfig WebPDecoderConfig;
// Return the decoder's version number, packed in hexadecimal using 8bits for
// each of major/minor/revision. E.g: v2.5.7 is 0x020507.
WEBP_EXTERN int WebPGetDecoderVersion(void);
// Retrieve basic header information: width, height.
// This function will also validate the header, returning true on success,
// false otherwise. '*width' and '*height' are only valid on successful return.
// Pointers 'width' and 'height' can be passed NULL if deemed irrelevant.
// Note: The following chunk sequences (before the raw VP8/VP8L data) are
// considered valid by this function:
// RIFF + VP8(L)
// RIFF + VP8X + (optional chunks) + VP8(L)
// ALPH + VP8 <-- Not a valid WebP format: only allowed for internal purpose.
// VP8(L) <-- Not a valid WebP format: only allowed for internal purpose.
WEBP_EXTERN int WebPGetInfo(const uint8_t* data, size_t data_size,
int* width, int* height);
// Decodes WebP images pointed to by 'data' and returns RGBA samples, along
// with the dimensions in *width and *height. The ordering of samples in
// memory is R, G, B, A, R, G, B, A... in scan order (endian-independent).
// The returned pointer should be deleted calling WebPFree().
// Returns NULL in case of error.
WEBP_EXTERN uint8_t* WebPDecodeRGBA(const uint8_t* data, size_t data_size,
int* width, int* height);
// Same as WebPDecodeRGBA, but returning A, R, G, B, A, R, G, B... ordered data.
WEBP_EXTERN uint8_t* WebPDecodeARGB(const uint8_t* data, size_t data_size,
int* width, int* height);
// Same as WebPDecodeRGBA, but returning B, G, R, A, B, G, R, A... ordered data.
WEBP_EXTERN uint8_t* WebPDecodeBGRA(const uint8_t* data, size_t data_size,
int* width, int* height);
// Same as WebPDecodeRGBA, but returning R, G, B, R, G, B... ordered data.
// If the bitstream contains transparency, it is ignored.
WEBP_EXTERN uint8_t* WebPDecodeRGB(const uint8_t* data, size_t data_size,
int* width, int* height);
// Same as WebPDecodeRGB, but returning B, G, R, B, G, R... ordered data.
WEBP_EXTERN uint8_t* WebPDecodeBGR(const uint8_t* data, size_t data_size,
int* width, int* height);
// Decode WebP images pointed to by 'data' to Y'UV format(*). The pointer
// returned is the Y samples buffer. Upon return, *u and *v will point to
// the U and V chroma data. These U and V buffers need NOT be passed to
// WebPFree(), unlike the returned Y luma one. The dimension of the U and V
// planes are both (*width + 1) / 2 and (*height + 1)/ 2.
// Upon return, the Y buffer has a stride returned as '*stride', while U and V
// have a common stride returned as '*uv_stride'.
// Return NULL in case of error.
// (*) Also named Y'CbCr. See: https://en.wikipedia.org/wiki/YCbCr
WEBP_EXTERN uint8_t* WebPDecodeYUV(const uint8_t* data, size_t data_size,
int* width, int* height,
uint8_t** u, uint8_t** v,
int* stride, int* uv_stride);
// These five functions are variants of the above ones, that decode the image
// directly into a pre-allocated buffer 'output_buffer'. The maximum storage
// available in this buffer is indicated by 'output_buffer_size'. If this
// storage is not sufficient (or an error occurred), NULL is returned.
// Otherwise, output_buffer is returned, for convenience.
// The parameter 'output_stride' specifies the distance (in bytes)
// between scanlines. Hence, output_buffer_size is expected to be at least
// output_stride x picture-height.
WEBP_EXTERN uint8_t* WebPDecodeRGBAInto(
const uint8_t* data, size_t data_size,
uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
WEBP_EXTERN uint8_t* WebPDecodeARGBInto(
const uint8_t* data, size_t data_size,
uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
WEBP_EXTERN uint8_t* WebPDecodeBGRAInto(
const uint8_t* data, size_t data_size,
uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
// RGB and BGR variants. Here too the transparency information, if present,
// will be dropped and ignored.
WEBP_EXTERN uint8_t* WebPDecodeRGBInto(
const uint8_t* data, size_t data_size,
uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
WEBP_EXTERN uint8_t* WebPDecodeBGRInto(
const uint8_t* data, size_t data_size,
uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
// WebPDecodeYUVInto() is a variant of WebPDecodeYUV() that operates directly
// into pre-allocated luma/chroma plane buffers. This function requires the
// strides to be passed: one for the luma plane and one for each of the
// chroma ones. The size of each plane buffer is passed as 'luma_size',
// 'u_size' and 'v_size' respectively.
// Pointer to the luma plane ('*luma') is returned or NULL if an error occurred
// during decoding (or because some buffers were found to be too small).
WEBP_EXTERN uint8_t* WebPDecodeYUVInto(
const uint8_t* data, size_t data_size,
uint8_t* luma, size_t luma_size, int luma_stride,
uint8_t* u, size_t u_size, int u_stride,
uint8_t* v, size_t v_size, int v_stride);
//------------------------------------------------------------------------------
// Output colorspaces and buffer
// Colorspaces
// Note: the naming describes the byte-ordering of packed samples in memory.
// For instance, MODE_BGRA relates to samples ordered as B,G,R,A,B,G,R,A,...
// Non-capital names (e.g.:MODE_Argb) relates to pre-multiplied RGB channels.
// RGBA-4444 and RGB-565 colorspaces are represented by following byte-order:
// RGBA-4444: [r3 r2 r1 r0 g3 g2 g1 g0], [b3 b2 b1 b0 a3 a2 a1 a0], ...
// RGB-565: [r4 r3 r2 r1 r0 g5 g4 g3], [g2 g1 g0 b4 b3 b2 b1 b0], ...
// In the case WEBP_SWAP_16BITS_CSP is defined, the bytes are swapped for
// these two modes:
// RGBA-4444: [b3 b2 b1 b0 a3 a2 a1 a0], [r3 r2 r1 r0 g3 g2 g1 g0], ...
// RGB-565: [g2 g1 g0 b4 b3 b2 b1 b0], [r4 r3 r2 r1 r0 g5 g4 g3], ...
typedef enum WEBP_CSP_MODE {
MODE_RGB = 0, MODE_RGBA = 1,
MODE_BGR = 2, MODE_BGRA = 3,
MODE_ARGB = 4, MODE_RGBA_4444 = 5,
MODE_RGB_565 = 6,
// RGB-premultiplied transparent modes (alpha value is preserved)
MODE_rgbA = 7,
MODE_bgrA = 8,
MODE_Argb = 9,
MODE_rgbA_4444 = 10,
// YUV modes must come after RGB ones.
MODE_YUV = 11, MODE_YUVA = 12, // yuv 4:2:0
MODE_LAST = 13
} WEBP_CSP_MODE;
// Some useful macros:
static WEBP_INLINE int WebPIsPremultipliedMode(WEBP_CSP_MODE mode) {
return (mode == MODE_rgbA || mode == MODE_bgrA || mode == MODE_Argb ||
mode == MODE_rgbA_4444);
}
static WEBP_INLINE int WebPIsAlphaMode(WEBP_CSP_MODE mode) {
return (mode == MODE_RGBA || mode == MODE_BGRA || mode == MODE_ARGB ||
mode == MODE_RGBA_4444 || mode == MODE_YUVA ||
WebPIsPremultipliedMode(mode));
}
static WEBP_INLINE int WebPIsRGBMode(WEBP_CSP_MODE mode) {
return (mode < MODE_YUV);
}
//------------------------------------------------------------------------------
// WebPDecBuffer: Generic structure for describing the output sample buffer.
struct WebPRGBABuffer { // view as RGBA
uint8_t* rgba; // pointer to RGBA samples
int stride; // stride in bytes from one scanline to the next.
size_t size; // total size of the *rgba buffer.
};
struct WebPYUVABuffer { // view as YUVA
uint8_t* y, *u, *v, *a; // pointer to luma, chroma U/V, alpha samples
int y_stride; // luma stride
int u_stride, v_stride; // chroma strides
int a_stride; // alpha stride
size_t y_size; // luma plane size
size_t u_size, v_size; // chroma planes size
size_t a_size; // alpha-plane size
};
// Output buffer
struct WebPDecBuffer {
WEBP_CSP_MODE colorspace; // Colorspace.
int width, height; // Dimensions.
int is_external_memory; // If non-zero, 'internal_memory' pointer is not
// used. If value is '2' or more, the external
// memory is considered 'slow' and multiple
// read/write will be avoided.
union {
WebPRGBABuffer RGBA;
WebPYUVABuffer YUVA;
} u; // Nameless union of buffer parameters.
uint32_t pad[4]; // padding for later use
uint8_t* private_memory; // Internally allocated memory (only when
// is_external_memory is 0). Should not be used
// externally, but accessed via the buffer union.
};
// Internal, version-checked, entry point
WEBP_EXTERN int WebPInitDecBufferInternal(WebPDecBuffer*, int);
// Initialize the structure as empty. Must be called before any other use.
// Returns false in case of version mismatch
static WEBP_INLINE int WebPInitDecBuffer(WebPDecBuffer* buffer) {
return WebPInitDecBufferInternal(buffer, WEBP_DECODER_ABI_VERSION);
}
// Free any memory associated with the buffer. Must always be called last.
// Note: doesn't free the 'buffer' structure itself.
WEBP_EXTERN void WebPFreeDecBuffer(WebPDecBuffer* buffer);
//------------------------------------------------------------------------------
// Enumeration of the status codes
typedef enum VP8StatusCode {
VP8_STATUS_OK = 0,
VP8_STATUS_OUT_OF_MEMORY,
VP8_STATUS_INVALID_PARAM,
VP8_STATUS_BITSTREAM_ERROR,
VP8_STATUS_UNSUPPORTED_FEATURE,
VP8_STATUS_SUSPENDED,
VP8_STATUS_USER_ABORT,
VP8_STATUS_NOT_ENOUGH_DATA
} VP8StatusCode;
//------------------------------------------------------------------------------
// Incremental decoding
//
// This API allows streamlined decoding of partial data.
// Picture can be incrementally decoded as data become available thanks to the
// WebPIDecoder object. This object can be left in a SUSPENDED state if the
// picture is only partially decoded, pending additional input.
// Code example:
//
// WebPInitDecBuffer(&output_buffer);
// output_buffer.colorspace = mode;
// ...
// WebPIDecoder* idec = WebPINewDecoder(&output_buffer);
// while (additional_data_is_available) {
// // ... (get additional data in some new_data[] buffer)
// status = WebPIAppend(idec, new_data, new_data_size);
// if (status != VP8_STATUS_OK && status != VP8_STATUS_SUSPENDED) {
// break; // an error occurred.
// }
//
// // The above call decodes the current available buffer.
// // Part of the image can now be refreshed by calling
// // WebPIDecGetRGB()/WebPIDecGetYUVA() etc.
// }
// WebPIDelete(idec);
// Creates a new incremental decoder with the supplied buffer parameter.
// This output_buffer can be passed NULL, in which case a default output buffer
// is used (with MODE_RGB). Otherwise, an internal reference to 'output_buffer'
// is kept, which means that the lifespan of 'output_buffer' must be larger than
// that of the returned WebPIDecoder object.
// The supplied 'output_buffer' content MUST NOT be changed between calls to
// WebPIAppend() or WebPIUpdate() unless 'output_buffer.is_external_memory' is
// not set to 0. In such a case, it is allowed to modify the pointers, size and
// stride of output_buffer.u.RGBA or output_buffer.u.YUVA, provided they remain
// within valid bounds.
// All other fields of WebPDecBuffer MUST remain constant between calls.
// Returns NULL if the allocation failed.
WEBP_EXTERN WebPIDecoder* WebPINewDecoder(WebPDecBuffer* output_buffer);
// This function allocates and initializes an incremental-decoder object, which
// will output the RGB/A samples specified by 'csp' into a preallocated
// buffer 'output_buffer'. The size of this buffer is at least
// 'output_buffer_size' and the stride (distance in bytes between two scanlines)
// is specified by 'output_stride'.
// Additionally, output_buffer can be passed NULL in which case the output
// buffer will be allocated automatically when the decoding starts. The
// colorspace 'csp' is taken into account for allocating this buffer. All other
// parameters are ignored.
// Returns NULL if the allocation failed, or if some parameters are invalid.
WEBP_EXTERN WebPIDecoder* WebPINewRGB(
WEBP_CSP_MODE csp,
uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
// This function allocates and initializes an incremental-decoder object, which
// will output the raw luma/chroma samples into a preallocated planes if
// supplied. The luma plane is specified by its pointer 'luma', its size
// 'luma_size' and its stride 'luma_stride'. Similarly, the chroma-u plane
// is specified by the 'u', 'u_size' and 'u_stride' parameters, and the chroma-v
// plane by 'v' and 'v_size'. And same for the alpha-plane. The 'a' pointer
// can be pass NULL in case one is not interested in the transparency plane.
// Conversely, 'luma' can be passed NULL if no preallocated planes are supplied.
// In this case, the output buffer will be automatically allocated (using
// MODE_YUVA) when decoding starts. All parameters are then ignored.
// Returns NULL if the allocation failed or if a parameter is invalid.
WEBP_EXTERN WebPIDecoder* WebPINewYUVA(
uint8_t* luma, size_t luma_size, int luma_stride,
uint8_t* u, size_t u_size, int u_stride,
uint8_t* v, size_t v_size, int v_stride,
uint8_t* a, size_t a_size, int a_stride);
// Deprecated version of the above, without the alpha plane.
// Kept for backward compatibility.
WEBP_EXTERN WebPIDecoder* WebPINewYUV(
uint8_t* luma, size_t luma_size, int luma_stride,
uint8_t* u, size_t u_size, int u_stride,
uint8_t* v, size_t v_size, int v_stride);
// Deletes the WebPIDecoder object and associated memory. Must always be called
// if WebPINewDecoder, WebPINewRGB or WebPINewYUV succeeded.
WEBP_EXTERN void WebPIDelete(WebPIDecoder* idec);
// Copies and decodes the next available data. Returns VP8_STATUS_OK when
// the image is successfully decoded. Returns VP8_STATUS_SUSPENDED when more
// data is expected. Returns error in other cases.
WEBP_EXTERN VP8StatusCode WebPIAppend(
WebPIDecoder* idec, const uint8_t* data, size_t data_size);
// A variant of the above function to be used when data buffer contains
// partial data from the beginning. In this case data buffer is not copied
// to the internal memory.
// Note that the value of the 'data' pointer can change between calls to
// WebPIUpdate, for instance when the data buffer is resized to fit larger data.
WEBP_EXTERN VP8StatusCode WebPIUpdate(
WebPIDecoder* idec, const uint8_t* data, size_t data_size);
// Returns the RGB/A image decoded so far. Returns NULL if output params
// are not initialized yet. The RGB/A output type corresponds to the colorspace
// specified during call to WebPINewDecoder() or WebPINewRGB().
// *last_y is the index of last decoded row in raster scan order. Some pointers
// (*last_y, *width etc.) can be NULL if corresponding information is not
// needed. The values in these pointers are only valid on successful (non-NULL)
// return.
WEBP_EXTERN uint8_t* WebPIDecGetRGB(
const WebPIDecoder* idec, int* last_y,
int* width, int* height, int* stride);
// Same as above function to get a YUVA image. Returns pointer to the luma
// plane or NULL in case of error. If there is no alpha information
// the alpha pointer '*a' will be returned NULL.
WEBP_EXTERN uint8_t* WebPIDecGetYUVA(
const WebPIDecoder* idec, int* last_y,
uint8_t** u, uint8_t** v, uint8_t** a,
int* width, int* height, int* stride, int* uv_stride, int* a_stride);
// Deprecated alpha-less version of WebPIDecGetYUVA(): it will ignore the
// alpha information (if present). Kept for backward compatibility.
static WEBP_INLINE uint8_t* WebPIDecGetYUV(
const WebPIDecoder* idec, int* last_y, uint8_t** u, uint8_t** v,
int* width, int* height, int* stride, int* uv_stride) {
return WebPIDecGetYUVA(idec, last_y, u, v, NULL, width, height,
stride, uv_stride, NULL);
}
// Generic call to retrieve information about the displayable area.
// If non NULL, the left/right/width/height pointers are filled with the visible
// rectangular area so far.
// Returns NULL in case the incremental decoder object is in an invalid state.
// Otherwise returns the pointer to the internal representation. This structure
// is read-only, tied to WebPIDecoder's lifespan and should not be modified.
WEBP_EXTERN const WebPDecBuffer* WebPIDecodedArea(
const WebPIDecoder* idec, int* left, int* top, int* width, int* height);
//------------------------------------------------------------------------------
// Advanced decoding parametrization
//
// Code sample for using the advanced decoding API
/*
// 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', if needed
config.no_fancy_upsampling = 1;
config.output.colorspace = MODE_BGRA;
// etc.
// Note that you can also make config.output point to an externally
// supplied memory buffer, provided it's big enough to store the decoded
// picture. Otherwise, config.output will just be used to allocate memory
// and store the decoded picture.
// D) Decode!
CHECK(WebPDecode(data, data_size, &config) == VP8_STATUS_OK);
// E) Decoded image is now in config.output (and config.output.u.RGBA)
// F) 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);
*/
// Features gathered from the bitstream
struct WebPBitstreamFeatures {
int width; // Width in pixels, as read from the bitstream.
int height; // Height in pixels, as read from the bitstream.
int has_alpha; // True if the bitstream contains an alpha channel.
int has_animation; // True if the bitstream is an animation.
int format; // 0 = undefined (/mixed), 1 = lossy, 2 = lossless
uint32_t pad[5]; // padding for later use
};
// Internal, version-checked, entry point
WEBP_EXTERN VP8StatusCode WebPGetFeaturesInternal(
const uint8_t*, size_t, WebPBitstreamFeatures*, int);
// Retrieve features from the bitstream. The *features structure is filled
// with information gathered from the bitstream.
// Returns VP8_STATUS_OK when the features are successfully retrieved. Returns
// VP8_STATUS_NOT_ENOUGH_DATA when more data is needed to retrieve the
// features from headers. Returns error in other cases.
// Note: The following chunk sequences (before the raw VP8/VP8L data) are
// considered valid by this function:
// RIFF + VP8(L)
// RIFF + VP8X + (optional chunks) + VP8(L)
// ALPH + VP8 <-- Not a valid WebP format: only allowed for internal purpose.
// VP8(L) <-- Not a valid WebP format: only allowed for internal purpose.
static WEBP_INLINE VP8StatusCode WebPGetFeatures(
const uint8_t* data, size_t data_size,
WebPBitstreamFeatures* features) {
return WebPGetFeaturesInternal(data, data_size, features,
WEBP_DECODER_ABI_VERSION);
}
// Decoding options
struct WebPDecoderOptions {
int bypass_filtering; // if true, skip the in-loop filtering
int no_fancy_upsampling; // if true, use faster pointwise upsampler
int use_cropping; // if true, cropping is applied _first_
int crop_left, crop_top; // top-left position for cropping.
// Will be snapped to even values.
int crop_width, crop_height; // dimension of the cropping area
int use_scaling; // if true, scaling is applied _afterward_
int scaled_width, scaled_height; // final resolution
int use_threads; // if true, use multi-threaded decoding
int dithering_strength; // dithering strength (0=Off, 100=full)
int flip; // if true, flip output vertically
int alpha_dithering_strength; // alpha dithering strength in [0..100]
uint32_t pad[5]; // padding for later use
};
// Main object storing the configuration for advanced decoding.
struct WebPDecoderConfig {
WebPBitstreamFeatures input; // Immutable bitstream features (optional)
WebPDecBuffer output; // Output buffer (can point to external mem)
WebPDecoderOptions options; // Decoding options
};
// Internal, version-checked, entry point
WEBP_EXTERN int WebPInitDecoderConfigInternal(WebPDecoderConfig*, int);
// Initialize the configuration as empty. This function must always be
// called first, unless WebPGetFeatures() is to be called.
// Returns false in case of mismatched version.
static WEBP_INLINE int WebPInitDecoderConfig(WebPDecoderConfig* config) {
return WebPInitDecoderConfigInternal(config, WEBP_DECODER_ABI_VERSION);
}
// Instantiate a new incremental decoder object with the requested
// configuration. The bitstream can be passed using 'data' and 'data_size'
// parameter, in which case the features will be parsed and stored into
// config->input. Otherwise, 'data' can be NULL and no parsing will occur.
// Note that 'config' can be NULL too, in which case a default configuration
// is used. If 'config' is not NULL, it must outlive the WebPIDecoder object
// as some references to its fields will be used. No internal copy of 'config'
// is made.
// The return WebPIDecoder object must always be deleted calling WebPIDelete().
// Returns NULL in case of error (and config->status will then reflect
// the error condition, if available).
WEBP_EXTERN WebPIDecoder* WebPIDecode(const uint8_t* data, size_t data_size,
WebPDecoderConfig* config);
// Non-incremental version. This version decodes the full data at once, taking
// 'config' into account. Returns decoding status (which should be VP8_STATUS_OK
// if the decoding was successful). Note that 'config' cannot be NULL.
WEBP_EXTERN VP8StatusCode WebPDecode(const uint8_t* data, size_t data_size,
WebPDecoderConfig* config);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // WEBP_WEBP_DECODE_H_
@@ -0,0 +1,363 @@
// Copyright 2012 Google Inc. All Rights Reserved.
//
// Use of this source code is governed by a BSD-style license
// that can be found in the COPYING file in the root of the source
// tree. An additional intellectual property rights grant can be found
// in the file PATENTS. All contributing project authors may
// be found in the AUTHORS file in the root of the source tree.
// -----------------------------------------------------------------------------
//
// Demux API.
// Enables extraction of image and extended format data from WebP files.
// Code Example: Demuxing WebP data to extract all the frames, ICC profile
// and EXIF/XMP metadata.
/*
WebPDemuxer* demux = WebPDemux(&webp_data);
uint32_t width = WebPDemuxGetI(demux, WEBP_FF_CANVAS_WIDTH);
uint32_t height = WebPDemuxGetI(demux, WEBP_FF_CANVAS_HEIGHT);
// ... (Get information about the features present in the WebP file).
uint32_t flags = WebPDemuxGetI(demux, WEBP_FF_FORMAT_FLAGS);
// ... (Iterate over all frames).
WebPIterator iter;
if (WebPDemuxGetFrame(demux, 1, &iter)) {
do {
// ... (Consume 'iter'; e.g. Decode 'iter.fragment' with WebPDecode(),
// ... and get other frame properties like width, height, offsets etc.
// ... see 'struct WebPIterator' below for more info).
} while (WebPDemuxNextFrame(&iter));
WebPDemuxReleaseIterator(&iter);
}
// ... (Extract metadata).
WebPChunkIterator chunk_iter;
if (flags & ICCP_FLAG) WebPDemuxGetChunk(demux, "ICCP", 1, &chunk_iter);
// ... (Consume the ICC profile in 'chunk_iter.chunk').
WebPDemuxReleaseChunkIterator(&chunk_iter);
if (flags & EXIF_FLAG) WebPDemuxGetChunk(demux, "EXIF", 1, &chunk_iter);
// ... (Consume the EXIF metadata in 'chunk_iter.chunk').
WebPDemuxReleaseChunkIterator(&chunk_iter);
if (flags & XMP_FLAG) WebPDemuxGetChunk(demux, "XMP ", 1, &chunk_iter);
// ... (Consume the XMP metadata in 'chunk_iter.chunk').
WebPDemuxReleaseChunkIterator(&chunk_iter);
WebPDemuxDelete(demux);
*/
#ifndef WEBP_WEBP_DEMUX_H_
#define WEBP_WEBP_DEMUX_H_
#include "./decode.h" // for WEBP_CSP_MODE
#include "./mux_types.h"
#ifdef __cplusplus
extern "C" {
#endif
#define WEBP_DEMUX_ABI_VERSION 0x0107 // MAJOR(8b) + MINOR(8b)
// Note: forward declaring enumerations is not allowed in (strict) C and C++,
// the types are left here for reference.
// typedef enum WebPDemuxState WebPDemuxState;
// typedef enum WebPFormatFeature WebPFormatFeature;
typedef struct WebPDemuxer WebPDemuxer;
typedef struct WebPIterator WebPIterator;
typedef struct WebPChunkIterator WebPChunkIterator;
typedef struct WebPAnimInfo WebPAnimInfo;
typedef struct WebPAnimDecoderOptions WebPAnimDecoderOptions;
//------------------------------------------------------------------------------
// Returns the version number of the demux library, packed in hexadecimal using
// 8bits for each of major/minor/revision. E.g: v2.5.7 is 0x020507.
WEBP_EXTERN int WebPGetDemuxVersion(void);
//------------------------------------------------------------------------------
// Life of a Demux object
typedef enum WebPDemuxState {
WEBP_DEMUX_PARSE_ERROR = -1, // An error occurred while parsing.
WEBP_DEMUX_PARSING_HEADER = 0, // Not enough data to parse full header.
WEBP_DEMUX_PARSED_HEADER = 1, // Header parsing complete,
// data may be available.
WEBP_DEMUX_DONE = 2 // Entire file has been parsed.
} WebPDemuxState;
// Internal, version-checked, entry point
WEBP_EXTERN WebPDemuxer* WebPDemuxInternal(
const WebPData*, int, WebPDemuxState*, int);
// Parses the full WebP file given by 'data'. For single images the WebP file
// header alone or the file header and the chunk header may be absent.
// Returns a WebPDemuxer object on successful parse, NULL otherwise.
static WEBP_INLINE WebPDemuxer* WebPDemux(const WebPData* data) {
return WebPDemuxInternal(data, 0, NULL, WEBP_DEMUX_ABI_VERSION);
}
// Parses the possibly incomplete WebP file given by 'data'.
// If 'state' is non-NULL it will be set to indicate the status of the demuxer.
// Returns NULL in case of error or if there isn't enough data to start parsing;
// and a WebPDemuxer object on successful parse.
// Note that WebPDemuxer keeps internal pointers to 'data' memory segment.
// If this data is volatile, the demuxer object should be deleted (by calling
// WebPDemuxDelete()) and WebPDemuxPartial() called again on the new data.
// This is usually an inexpensive operation.
static WEBP_INLINE WebPDemuxer* WebPDemuxPartial(
const WebPData* data, WebPDemuxState* state) {
return WebPDemuxInternal(data, 1, state, WEBP_DEMUX_ABI_VERSION);
}
// Frees memory associated with 'dmux'.
WEBP_EXTERN void WebPDemuxDelete(WebPDemuxer* dmux);
//------------------------------------------------------------------------------
// Data/information extraction.
typedef enum WebPFormatFeature {
WEBP_FF_FORMAT_FLAGS, // bit-wise combination of WebPFeatureFlags
// corresponding to the 'VP8X' chunk (if present).
WEBP_FF_CANVAS_WIDTH,
WEBP_FF_CANVAS_HEIGHT,
WEBP_FF_LOOP_COUNT, // only relevant for animated file
WEBP_FF_BACKGROUND_COLOR, // idem.
WEBP_FF_FRAME_COUNT // Number of frames present in the demux object.
// In case of a partial demux, this is the number
// of frames seen so far, with the last frame
// possibly being partial.
} WebPFormatFeature;
// Get the 'feature' value from the 'dmux'.
// NOTE: values are only valid if WebPDemux() was used or WebPDemuxPartial()
// returned a state > WEBP_DEMUX_PARSING_HEADER.
// If 'feature' is WEBP_FF_FORMAT_FLAGS, the returned value is a bit-wise
// combination of WebPFeatureFlags values.
// If 'feature' is WEBP_FF_LOOP_COUNT, WEBP_FF_BACKGROUND_COLOR, the returned
// value is only meaningful if the bitstream is animated.
WEBP_EXTERN uint32_t WebPDemuxGetI(
const WebPDemuxer* dmux, WebPFormatFeature feature);
//------------------------------------------------------------------------------
// Frame iteration.
struct WebPIterator {
int frame_num;
int num_frames; // equivalent to WEBP_FF_FRAME_COUNT.
int x_offset, y_offset; // offset relative to the canvas.
int width, height; // dimensions of this frame.
int duration; // display duration in milliseconds.
WebPMuxAnimDispose dispose_method; // dispose method for the frame.
int complete; // true if 'fragment' contains a full frame. partial images
// may still be decoded with the WebP incremental decoder.
WebPData fragment; // The frame given by 'frame_num'. Note for historical
// reasons this is called a fragment.
int has_alpha; // True if the frame contains transparency.
WebPMuxAnimBlend blend_method; // Blend operation for the frame.
uint32_t pad[2]; // padding for later use.
void* private_; // for internal use only.
};
// Retrieves frame 'frame_number' from 'dmux'.
// 'iter->fragment' points to the frame on return from this function.
// Setting 'frame_number' equal to 0 will return the last frame of the image.
// Returns false if 'dmux' is NULL or frame 'frame_number' is not present.
// Call WebPDemuxReleaseIterator() when use of the iterator is complete.
// NOTE: 'dmux' must persist for the lifetime of 'iter'.
WEBP_EXTERN int WebPDemuxGetFrame(
const WebPDemuxer* dmux, int frame_number, WebPIterator* iter);
// Sets 'iter->fragment' to point to the next ('iter->frame_num' + 1) or
// previous ('iter->frame_num' - 1) frame. These functions do not loop.
// Returns true on success, false otherwise.
WEBP_EXTERN int WebPDemuxNextFrame(WebPIterator* iter);
WEBP_EXTERN int WebPDemuxPrevFrame(WebPIterator* iter);
// Releases any memory associated with 'iter'.
// Must be called before any subsequent calls to WebPDemuxGetChunk() on the same
// iter. Also, must be called before destroying the associated WebPDemuxer with
// WebPDemuxDelete().
WEBP_EXTERN void WebPDemuxReleaseIterator(WebPIterator* iter);
//------------------------------------------------------------------------------
// Chunk iteration.
struct WebPChunkIterator {
// The current and total number of chunks with the fourcc given to
// WebPDemuxGetChunk().
int chunk_num;
int num_chunks;
WebPData chunk; // The payload of the chunk.
uint32_t pad[6]; // padding for later use
void* private_;
};
// Retrieves the 'chunk_number' instance of the chunk with id 'fourcc' from
// 'dmux'.
// 'fourcc' is a character array containing the fourcc of the chunk to return,
// e.g., "ICCP", "XMP ", "EXIF", etc.
// Setting 'chunk_number' equal to 0 will return the last chunk in a set.
// Returns true if the chunk is found, false otherwise. Image related chunk
// payloads are accessed through WebPDemuxGetFrame() and related functions.
// Call WebPDemuxReleaseChunkIterator() when use of the iterator is complete.
// NOTE: 'dmux' must persist for the lifetime of the iterator.
WEBP_EXTERN int WebPDemuxGetChunk(const WebPDemuxer* dmux,
const char fourcc[4], int chunk_number,
WebPChunkIterator* iter);
// Sets 'iter->chunk' to point to the next ('iter->chunk_num' + 1) or previous
// ('iter->chunk_num' - 1) chunk. These functions do not loop.
// Returns true on success, false otherwise.
WEBP_EXTERN int WebPDemuxNextChunk(WebPChunkIterator* iter);
WEBP_EXTERN int WebPDemuxPrevChunk(WebPChunkIterator* iter);
// Releases any memory associated with 'iter'.
// Must be called before destroying the associated WebPDemuxer with
// WebPDemuxDelete().
WEBP_EXTERN void WebPDemuxReleaseChunkIterator(WebPChunkIterator* iter);
//------------------------------------------------------------------------------
// WebPAnimDecoder API
//
// This API allows decoding (possibly) animated WebP images.
//
// Code Example:
/*
WebPAnimDecoderOptions dec_options;
WebPAnimDecoderOptionsInit(&dec_options);
// Tune 'dec_options' as needed.
WebPAnimDecoder* dec = WebPAnimDecoderNew(webp_data, &dec_options);
WebPAnimInfo anim_info;
WebPAnimDecoderGetInfo(dec, &anim_info);
for (uint32_t i = 0; i < anim_info.loop_count; ++i) {
while (WebPAnimDecoderHasMoreFrames(dec)) {
uint8_t* buf;
int timestamp;
WebPAnimDecoderGetNext(dec, &buf, &timestamp);
// ... (Render 'buf' based on 'timestamp').
// ... (Do NOT free 'buf', as it is owned by 'dec').
}
WebPAnimDecoderReset(dec);
}
const WebPDemuxer* demuxer = WebPAnimDecoderGetDemuxer(dec);
// ... (Do something using 'demuxer'; e.g. get EXIF/XMP/ICC data).
WebPAnimDecoderDelete(dec);
*/
typedef struct WebPAnimDecoder WebPAnimDecoder; // Main opaque object.
// Global options.
struct WebPAnimDecoderOptions {
// Output colorspace. Only the following modes are supported:
// MODE_RGBA, MODE_BGRA, MODE_rgbA and MODE_bgrA.
WEBP_CSP_MODE color_mode;
int use_threads; // If true, use multi-threaded decoding.
uint32_t padding[7]; // Padding for later use.
};
// Internal, version-checked, entry point.
WEBP_EXTERN int WebPAnimDecoderOptionsInitInternal(
WebPAnimDecoderOptions*, int);
// Should always be called, to initialize a fresh WebPAnimDecoderOptions
// structure before modification. Returns false in case of version mismatch.
// WebPAnimDecoderOptionsInit() must have succeeded before using the
// 'dec_options' object.
static WEBP_INLINE int WebPAnimDecoderOptionsInit(
WebPAnimDecoderOptions* dec_options) {
return WebPAnimDecoderOptionsInitInternal(dec_options,
WEBP_DEMUX_ABI_VERSION);
}
// Internal, version-checked, entry point.
WEBP_EXTERN WebPAnimDecoder* WebPAnimDecoderNewInternal(
const WebPData*, const WebPAnimDecoderOptions*, int);
// Creates and initializes a WebPAnimDecoder object.
// Parameters:
// webp_data - (in) WebP bitstream. This should remain unchanged during the
// lifetime of the output WebPAnimDecoder object.
// dec_options - (in) decoding options. Can be passed NULL to choose
// reasonable defaults (in particular, color mode MODE_RGBA
// will be picked).
// Returns:
// A pointer to the newly created WebPAnimDecoder object, or NULL in case of
// parsing error, invalid option or memory error.
static WEBP_INLINE WebPAnimDecoder* WebPAnimDecoderNew(
const WebPData* webp_data, const WebPAnimDecoderOptions* dec_options) {
return WebPAnimDecoderNewInternal(webp_data, dec_options,
WEBP_DEMUX_ABI_VERSION);
}
// Global information about the animation..
struct WebPAnimInfo {
uint32_t canvas_width;
uint32_t canvas_height;
uint32_t loop_count;
uint32_t bgcolor;
uint32_t frame_count;
uint32_t pad[4]; // padding for later use
};
// Get global information about the animation.
// Parameters:
// dec - (in) decoder instance to get information from.
// info - (out) global information fetched from the animation.
// Returns:
// True on success.
WEBP_EXTERN int WebPAnimDecoderGetInfo(const WebPAnimDecoder* dec,
WebPAnimInfo* info);
// Fetch the next frame from 'dec' based on options supplied to
// WebPAnimDecoderNew(). This will be a fully reconstructed canvas of size
// 'canvas_width * 4 * canvas_height', and not just the frame sub-rectangle. The
// returned buffer 'buf' is valid only until the next call to
// WebPAnimDecoderGetNext(), WebPAnimDecoderReset() or WebPAnimDecoderDelete().
// Parameters:
// dec - (in/out) decoder instance from which the next frame is to be fetched.
// buf - (out) decoded frame.
// timestamp - (out) timestamp of the frame in milliseconds.
// Returns:
// False if any of the arguments are NULL, or if there is a parsing or
// decoding error, or if there are no more frames. Otherwise, returns true.
WEBP_EXTERN int WebPAnimDecoderGetNext(WebPAnimDecoder* dec,
uint8_t** buf, int* timestamp);
// Check if there are more frames left to decode.
// Parameters:
// dec - (in) decoder instance to be checked.
// Returns:
// True if 'dec' is not NULL and some frames are yet to be decoded.
// Otherwise, returns false.
WEBP_EXTERN int WebPAnimDecoderHasMoreFrames(const WebPAnimDecoder* dec);
// Resets the WebPAnimDecoder object, so that next call to
// WebPAnimDecoderGetNext() will restart decoding from 1st frame. This would be
// helpful when all frames need to be decoded multiple times (e.g.
// info.loop_count times) without destroying and recreating the 'dec' object.
// Parameters:
// dec - (in/out) decoder instance to be reset
WEBP_EXTERN void WebPAnimDecoderReset(WebPAnimDecoder* dec);
// Grab the internal demuxer object.
// Getting the demuxer object can be useful if one wants to use operations only
// available through demuxer; e.g. to get XMP/EXIF/ICC metadata. The returned
// demuxer object is owned by 'dec' and is valid only until the next call to
// WebPAnimDecoderDelete().
//
// Parameters:
// dec - (in) decoder instance from which the demuxer object is to be fetched.
WEBP_EXTERN const WebPDemuxer* WebPAnimDecoderGetDemuxer(
const WebPAnimDecoder* dec);
// Deletes the WebPAnimDecoder object.
// Parameters:
// dec - (in/out) decoder instance to be deleted
WEBP_EXTERN void WebPAnimDecoderDelete(WebPAnimDecoder* dec);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // WEBP_WEBP_DEMUX_H_
@@ -0,0 +1,552 @@
// Copyright 2011 Google Inc. All Rights Reserved.
//
// Use of this source code is governed by a BSD-style license
// that can be found in the COPYING file in the root of the source
// tree. An additional intellectual property rights grant can be found
// in the file PATENTS. All contributing project authors may
// be found in the AUTHORS file in the root of the source tree.
// -----------------------------------------------------------------------------
//
// WebP encoder: main interface
//
// Author: Skal (pascal.massimino@gmail.com)
#ifndef WEBP_WEBP_ENCODE_H_
#define WEBP_WEBP_ENCODE_H_
#include "./types.h"
#ifdef __cplusplus
extern "C" {
#endif
#define WEBP_ENCODER_ABI_VERSION 0x020f // MAJOR(8b) + MINOR(8b)
// Note: forward declaring enumerations is not allowed in (strict) C and C++,
// the types are left here for reference.
// typedef enum WebPImageHint WebPImageHint;
// typedef enum WebPEncCSP WebPEncCSP;
// typedef enum WebPPreset WebPPreset;
// typedef enum WebPEncodingError WebPEncodingError;
typedef struct WebPConfig WebPConfig;
typedef struct WebPPicture WebPPicture; // main structure for I/O
typedef struct WebPAuxStats WebPAuxStats;
typedef struct WebPMemoryWriter WebPMemoryWriter;
// Return the encoder's version number, packed in hexadecimal using 8bits for
// each of major/minor/revision. E.g: v2.5.7 is 0x020507.
WEBP_EXTERN int WebPGetEncoderVersion(void);
//------------------------------------------------------------------------------
// One-stop-shop call! No questions asked:
// Returns the size of the compressed data (pointed to by *output), or 0 if
// an error occurred. The compressed data must be released by the caller
// using the call 'WebPFree(*output)'.
// These functions compress using the lossy format, and the quality_factor
// can go from 0 (smaller output, lower quality) to 100 (best quality,
// larger output).
WEBP_EXTERN size_t WebPEncodeRGB(const uint8_t* rgb,
int width, int height, int stride,
float quality_factor, uint8_t** output);
WEBP_EXTERN size_t WebPEncodeBGR(const uint8_t* bgr,
int width, int height, int stride,
float quality_factor, uint8_t** output);
WEBP_EXTERN size_t WebPEncodeRGBA(const uint8_t* rgba,
int width, int height, int stride,
float quality_factor, uint8_t** output);
WEBP_EXTERN size_t WebPEncodeBGRA(const uint8_t* bgra,
int width, int height, int stride,
float quality_factor, uint8_t** output);
// These functions are the equivalent of the above, but compressing in a
// lossless manner. Files are usually larger than lossy format, but will
// not suffer any compression loss.
// Note these functions, like the lossy versions, use the library's default
// settings. For lossless this means 'exact' is disabled. RGB values in
// transparent areas will be modified to improve compression. To avoid this,
// use WebPEncode() and set WebPConfig::exact to 1.
WEBP_EXTERN size_t WebPEncodeLosslessRGB(const uint8_t* rgb,
int width, int height, int stride,
uint8_t** output);
WEBP_EXTERN size_t WebPEncodeLosslessBGR(const uint8_t* bgr,
int width, int height, int stride,
uint8_t** output);
WEBP_EXTERN size_t WebPEncodeLosslessRGBA(const uint8_t* rgba,
int width, int height, int stride,
uint8_t** output);
WEBP_EXTERN size_t WebPEncodeLosslessBGRA(const uint8_t* bgra,
int width, int height, int stride,
uint8_t** output);
//------------------------------------------------------------------------------
// Coding parameters
// Image characteristics hint for the underlying encoder.
typedef enum WebPImageHint {
WEBP_HINT_DEFAULT = 0, // default preset.
WEBP_HINT_PICTURE, // digital picture, like portrait, inner shot
WEBP_HINT_PHOTO, // outdoor photograph, with natural lighting
WEBP_HINT_GRAPH, // Discrete tone image (graph, map-tile etc).
WEBP_HINT_LAST
} WebPImageHint;
// Compression parameters.
struct WebPConfig {
int lossless; // Lossless encoding (0=lossy(default), 1=lossless).
float quality; // between 0 and 100. For lossy, 0 gives the smallest
// size and 100 the largest. For lossless, this
// parameter is the amount of effort put into the
// compression: 0 is the fastest but gives larger
// files compared to the slowest, but best, 100.
int method; // quality/speed trade-off (0=fast, 6=slower-better)
WebPImageHint image_hint; // Hint for image type (lossless only for now).
int target_size; // if non-zero, set the desired target size in bytes.
// Takes precedence over the 'compression' parameter.
float target_PSNR; // if non-zero, specifies the minimal distortion to
// try to achieve. Takes precedence over target_size.
int segments; // maximum number of segments to use, in [1..4]
int sns_strength; // Spatial Noise Shaping. 0=off, 100=maximum.
int filter_strength; // range: [0 = off .. 100 = strongest]
int filter_sharpness; // range: [0 = off .. 7 = least sharp]
int filter_type; // filtering type: 0 = simple, 1 = strong (only used
// if filter_strength > 0 or autofilter > 0)
int autofilter; // Auto adjust filter's strength [0 = off, 1 = on]
int alpha_compression; // Algorithm for encoding the alpha plane (0 = none,
// 1 = compressed with WebP lossless). Default is 1.
int alpha_filtering; // Predictive filtering method for alpha plane.
// 0: none, 1: fast, 2: best. Default if 1.
int alpha_quality; // Between 0 (smallest size) and 100 (lossless).
// Default is 100.
int pass; // number of entropy-analysis passes (in [1..10]).
int show_compressed; // if true, export the compressed picture back.
// In-loop filtering is not applied.
int preprocessing; // preprocessing filter:
// 0=none, 1=segment-smooth, 2=pseudo-random dithering
int partitions; // log2(number of token partitions) in [0..3]. Default
// is set to 0 for easier progressive decoding.
int partition_limit; // quality degradation allowed to fit the 512k limit
// on prediction modes coding (0: no degradation,
// 100: maximum possible degradation).
int emulate_jpeg_size; // If true, compression parameters will be remapped
// to better match the expected output size from
// JPEG compression. Generally, the output size will
// be similar but the degradation will be lower.
int thread_level; // If non-zero, try and use multi-threaded encoding.
int low_memory; // If set, reduce memory usage (but increase CPU use).
int near_lossless; // Near lossless encoding [0 = max loss .. 100 = off
// (default)].
int exact; // if non-zero, preserve the exact RGB values under
// transparent area. Otherwise, discard this invisible
// RGB information for better compression. The default
// value is 0.
int use_delta_palette; // reserved for future lossless feature
int use_sharp_yuv; // if needed, use sharp (and slow) RGB->YUV conversion
int qmin; // minimum permissible quality factor
int qmax; // maximum permissible quality factor
};
// Enumerate some predefined settings for WebPConfig, depending on the type
// of source picture. These presets are used when calling WebPConfigPreset().
typedef enum WebPPreset {
WEBP_PRESET_DEFAULT = 0, // default preset.
WEBP_PRESET_PICTURE, // digital picture, like portrait, inner shot
WEBP_PRESET_PHOTO, // outdoor photograph, with natural lighting
WEBP_PRESET_DRAWING, // hand or line drawing, with high-contrast details
WEBP_PRESET_ICON, // small-sized colorful images
WEBP_PRESET_TEXT // text-like
} WebPPreset;
// Internal, version-checked, entry point
WEBP_EXTERN int WebPConfigInitInternal(WebPConfig*, WebPPreset, float, int);
// Should always be called, to initialize a fresh WebPConfig structure before
// modification. Returns false in case of version mismatch. WebPConfigInit()
// must have succeeded before using the 'config' object.
// Note that the default values are lossless=0 and quality=75.
static WEBP_INLINE int WebPConfigInit(WebPConfig* config) {
return WebPConfigInitInternal(config, WEBP_PRESET_DEFAULT, 75.f,
WEBP_ENCODER_ABI_VERSION);
}
// This function will initialize the configuration according to a predefined
// set of parameters (referred to by 'preset') and a given quality factor.
// This function can be called as a replacement to WebPConfigInit(). Will
// return false in case of error.
static WEBP_INLINE int WebPConfigPreset(WebPConfig* config,
WebPPreset preset, float quality) {
return WebPConfigInitInternal(config, preset, quality,
WEBP_ENCODER_ABI_VERSION);
}
// Activate the lossless compression mode with the desired efficiency level
// between 0 (fastest, lowest compression) and 9 (slower, best compression).
// A good default level is '6', providing a fair tradeoff between compression
// speed and final compressed size.
// This function will overwrite several fields from config: 'method', 'quality'
// and 'lossless'. Returns false in case of parameter error.
WEBP_EXTERN int WebPConfigLosslessPreset(WebPConfig* config, int level);
// Returns true if 'config' is non-NULL and all configuration parameters are
// within their valid ranges.
WEBP_EXTERN int WebPValidateConfig(const WebPConfig* config);
//------------------------------------------------------------------------------
// Input / Output
// Structure for storing auxiliary statistics.
struct WebPAuxStats {
int coded_size; // final size
float PSNR[5]; // peak-signal-to-noise ratio for Y/U/V/All/Alpha
int block_count[3]; // number of intra4/intra16/skipped macroblocks
int header_bytes[2]; // approximate number of bytes spent for header
// and mode-partition #0
int residual_bytes[3][4]; // approximate number of bytes spent for
// DC/AC/uv coefficients for each (0..3) segments.
int segment_size[4]; // number of macroblocks in each segments
int segment_quant[4]; // quantizer values for each segments
int segment_level[4]; // filtering strength for each segments [0..63]
int alpha_data_size; // size of the transparency data
int layer_data_size; // size of the enhancement layer data
// lossless encoder statistics
uint32_t lossless_features; // bit0:predictor bit1:cross-color transform
// bit2:subtract-green bit3:color indexing
int histogram_bits; // number of precision bits of histogram
int transform_bits; // precision bits for transform
int cache_bits; // number of bits for color cache lookup
int palette_size; // number of color in palette, if used
int lossless_size; // final lossless size
int lossless_hdr_size; // lossless header (transform, huffman etc) size
int lossless_data_size; // lossless image data size
uint32_t pad[2]; // padding for later use
};
// Signature for output function. Should return true if writing was successful.
// data/data_size is the segment of data to write, and 'picture' is for
// reference (and so one can make use of picture->custom_ptr).
typedef int (*WebPWriterFunction)(const uint8_t* data, size_t data_size,
const WebPPicture* picture);
// WebPMemoryWrite: a special WebPWriterFunction that writes to memory using
// the following WebPMemoryWriter object (to be set as a custom_ptr).
struct WebPMemoryWriter {
uint8_t* mem; // final buffer (of size 'max_size', larger than 'size').
size_t size; // final size
size_t max_size; // total capacity
uint32_t pad[1]; // padding for later use
};
// The following must be called first before any use.
WEBP_EXTERN void WebPMemoryWriterInit(WebPMemoryWriter* writer);
// The following must be called to deallocate writer->mem memory. The 'writer'
// object itself is not deallocated.
WEBP_EXTERN void WebPMemoryWriterClear(WebPMemoryWriter* writer);
// The custom writer to be used with WebPMemoryWriter as custom_ptr. Upon
// completion, writer.mem and writer.size will hold the coded data.
// writer.mem must be freed by calling WebPMemoryWriterClear.
WEBP_EXTERN int WebPMemoryWrite(const uint8_t* data, size_t data_size,
const WebPPicture* picture);
// Progress hook, called from time to time to report progress. It can return
// false to request an abort of the encoding process, or true otherwise if
// everything is OK.
typedef int (*WebPProgressHook)(int percent, const WebPPicture* picture);
// Color spaces.
typedef enum WebPEncCSP {
// chroma sampling
WEBP_YUV420 = 0, // 4:2:0
WEBP_YUV420A = 4, // alpha channel variant
WEBP_CSP_UV_MASK = 3, // bit-mask to get the UV sampling factors
WEBP_CSP_ALPHA_BIT = 4 // bit that is set if alpha is present
} WebPEncCSP;
// Encoding error conditions.
typedef enum WebPEncodingError {
VP8_ENC_OK = 0,
VP8_ENC_ERROR_OUT_OF_MEMORY, // memory error allocating objects
VP8_ENC_ERROR_BITSTREAM_OUT_OF_MEMORY, // memory error while flushing bits
VP8_ENC_ERROR_NULL_PARAMETER, // a pointer parameter is NULL
VP8_ENC_ERROR_INVALID_CONFIGURATION, // configuration is invalid
VP8_ENC_ERROR_BAD_DIMENSION, // picture has invalid width/height
VP8_ENC_ERROR_PARTITION0_OVERFLOW, // partition is bigger than 512k
VP8_ENC_ERROR_PARTITION_OVERFLOW, // partition is bigger than 16M
VP8_ENC_ERROR_BAD_WRITE, // error while flushing bytes
VP8_ENC_ERROR_FILE_TOO_BIG, // file is bigger than 4G
VP8_ENC_ERROR_USER_ABORT, // abort request by user
VP8_ENC_ERROR_LAST // list terminator. always last.
} WebPEncodingError;
// maximum width/height allowed (inclusive), in pixels
#define WEBP_MAX_DIMENSION 16383
// Main exchange structure (input samples, output bytes, statistics)
//
// Once WebPPictureInit() has been called, it's ok to make all the INPUT fields
// (use_argb, y/u/v, argb, ...) point to user-owned data, even if
// WebPPictureAlloc() has been called. Depending on the value use_argb,
// it's guaranteed that either *argb or *y/*u/*v content will be kept untouched.
struct WebPPicture {
// INPUT
//////////////
// Main flag for encoder selecting between ARGB or YUV input.
// It is recommended to use ARGB input (*argb, argb_stride) for lossless
// compression, and YUV input (*y, *u, *v, etc.) for lossy compression
// since these are the respective native colorspace for these formats.
int use_argb;
// YUV input (mostly used for input to lossy compression)
WebPEncCSP colorspace; // colorspace: should be YUV420 for now (=Y'CbCr).
int width, height; // dimensions (less or equal to WEBP_MAX_DIMENSION)
uint8_t* y, *u, *v; // pointers to luma/chroma planes.
int y_stride, uv_stride; // luma/chroma strides.
uint8_t* a; // pointer to the alpha plane
int a_stride; // stride of the alpha plane
uint32_t pad1[2]; // padding for later use
// ARGB input (mostly used for input to lossless compression)
uint32_t* argb; // Pointer to argb (32 bit) plane.
int argb_stride; // This is stride in pixels units, not bytes.
uint32_t pad2[3]; // padding for later use
// OUTPUT
///////////////
// Byte-emission hook, to store compressed bytes as they are ready.
WebPWriterFunction writer; // can be NULL
void* custom_ptr; // can be used by the writer.
// map for extra information (only for lossy compression mode)
int extra_info_type; // 1: intra type, 2: segment, 3: quant
// 4: intra-16 prediction mode,
// 5: chroma prediction mode,
// 6: bit cost, 7: distortion
uint8_t* extra_info; // if not NULL, points to an array of size
// ((width + 15) / 16) * ((height + 15) / 16) that
// will be filled with a macroblock map, depending
// on extra_info_type.
// STATS AND REPORTS
///////////////////////////
// Pointer to side statistics (updated only if not NULL)
WebPAuxStats* stats;
// Error code for the latest error encountered during encoding
WebPEncodingError error_code;
// If not NULL, report progress during encoding.
WebPProgressHook progress_hook;
void* user_data; // this field is free to be set to any value and
// used during callbacks (like progress-report e.g.).
uint32_t pad3[3]; // padding for later use
// Unused for now
uint8_t* pad4, *pad5;
uint32_t pad6[8]; // padding for later use
// PRIVATE FIELDS
////////////////////
void* memory_; // row chunk of memory for yuva planes
void* memory_argb_; // and for argb too.
void* pad7[2]; // padding for later use
};
// Internal, version-checked, entry point
WEBP_EXTERN int WebPPictureInitInternal(WebPPicture*, int);
// Should always be called, to initialize the structure. Returns false in case
// of version mismatch. WebPPictureInit() must have succeeded before using the
// 'picture' object.
// Note that, by default, use_argb is false and colorspace is WEBP_YUV420.
static WEBP_INLINE int WebPPictureInit(WebPPicture* picture) {
return WebPPictureInitInternal(picture, WEBP_ENCODER_ABI_VERSION);
}
//------------------------------------------------------------------------------
// WebPPicture utils
// Convenience allocation / deallocation based on picture->width/height:
// Allocate y/u/v buffers as per colorspace/width/height specification.
// Note! This function will free the previous buffer if needed.
// Returns false in case of memory error.
WEBP_EXTERN int WebPPictureAlloc(WebPPicture* picture);
// Release the memory allocated by WebPPictureAlloc() or WebPPictureImport*().
// Note that this function does _not_ free the memory used by the 'picture'
// object itself.
// Besides memory (which is reclaimed) all other fields of 'picture' are
// preserved.
WEBP_EXTERN void WebPPictureFree(WebPPicture* picture);
// Copy the pixels of *src into *dst, using WebPPictureAlloc. Upon return, *dst
// will fully own the copied pixels (this is not a view). The 'dst' picture need
// not be initialized as its content is overwritten.
// Returns false in case of memory allocation error.
WEBP_EXTERN int WebPPictureCopy(const WebPPicture* src, WebPPicture* dst);
// Compute the single distortion for packed planes of samples.
// 'src' will be compared to 'ref', and the raw distortion stored into
// '*distortion'. The refined metric (log(MSE), log(1 - ssim),...' will be
// stored in '*result'.
// 'x_step' is the horizontal stride (in bytes) between samples.
// 'src/ref_stride' is the byte distance between rows.
// Returns false in case of error (bad parameter, memory allocation error, ...).
WEBP_EXTERN int WebPPlaneDistortion(const uint8_t* src, size_t src_stride,
const uint8_t* ref, size_t ref_stride,
int width, int height,
size_t x_step,
int type, // 0 = PSNR, 1 = SSIM, 2 = LSIM
float* distortion, float* result);
// Compute PSNR, SSIM or LSIM distortion metric between two pictures. Results
// are in dB, stored in result[] in the B/G/R/A/All order. The distortion is
// always performed using ARGB samples. Hence if the input is YUV(A), the
// picture will be internally converted to ARGB (just for the measurement).
// Warning: this function is rather CPU-intensive.
WEBP_EXTERN int WebPPictureDistortion(
const WebPPicture* src, const WebPPicture* ref,
int metric_type, // 0 = PSNR, 1 = SSIM, 2 = LSIM
float result[5]);
// self-crops a picture to the rectangle defined by top/left/width/height.
// Returns false in case of memory allocation error, or if the rectangle is
// outside of the source picture.
// The rectangle for the view is defined by the top-left corner pixel
// coordinates (left, top) as well as its width and height. This rectangle
// must be fully be comprised inside the 'src' source picture. If the source
// picture uses the YUV420 colorspace, the top and left coordinates will be
// snapped to even values.
WEBP_EXTERN int WebPPictureCrop(WebPPicture* picture,
int left, int top, int width, int height);
// Extracts a view from 'src' picture into 'dst'. The rectangle for the view
// is defined by the top-left corner pixel coordinates (left, top) as well
// as its width and height. This rectangle must be fully be comprised inside
// the 'src' source picture. If the source picture uses the YUV420 colorspace,
// the top and left coordinates will be snapped to even values.
// Picture 'src' must out-live 'dst' picture. Self-extraction of view is allowed
// ('src' equal to 'dst') as a mean of fast-cropping (but note that doing so,
// the original dimension will be lost). Picture 'dst' need not be initialized
// with WebPPictureInit() if it is different from 'src', since its content will
// be overwritten.
// Returns false in case of invalid parameters.
WEBP_EXTERN int WebPPictureView(const WebPPicture* src,
int left, int top, int width, int height,
WebPPicture* dst);
// Returns true if the 'picture' is actually a view and therefore does
// not own the memory for pixels.
WEBP_EXTERN int WebPPictureIsView(const WebPPicture* picture);
// Rescale a picture to new dimension width x height.
// If either 'width' or 'height' (but not both) is 0 the corresponding
// dimension will be calculated preserving the aspect ratio.
// No gamma correction is applied.
// Returns false in case of error (invalid parameter or insufficient memory).
WEBP_EXTERN int WebPPictureRescale(WebPPicture* picture, int width, int height);
// Colorspace conversion function to import RGB samples.
// Previous buffer will be free'd, if any.
// *rgb buffer should have a size of at least height * rgb_stride.
// Returns false in case of memory error.
WEBP_EXTERN int WebPPictureImportRGB(
WebPPicture* picture, const uint8_t* rgb, int rgb_stride);
// Same, but for RGBA buffer.
WEBP_EXTERN int WebPPictureImportRGBA(
WebPPicture* picture, const uint8_t* rgba, int rgba_stride);
// Same, but for RGBA buffer. Imports the RGB direct from the 32-bit format
// input buffer ignoring the alpha channel. Avoids needing to copy the data
// to a temporary 24-bit RGB buffer to import the RGB only.
WEBP_EXTERN int WebPPictureImportRGBX(
WebPPicture* picture, const uint8_t* rgbx, int rgbx_stride);
// Variants of the above, but taking BGR(A|X) input.
WEBP_EXTERN int WebPPictureImportBGR(
WebPPicture* picture, const uint8_t* bgr, int bgr_stride);
WEBP_EXTERN int WebPPictureImportBGRA(
WebPPicture* picture, const uint8_t* bgra, int bgra_stride);
WEBP_EXTERN int WebPPictureImportBGRX(
WebPPicture* picture, const uint8_t* bgrx, int bgrx_stride);
// Converts picture->argb data to the YUV420A format. The 'colorspace'
// parameter is deprecated and should be equal to WEBP_YUV420.
// Upon return, picture->use_argb is set to false. The presence of real
// non-opaque transparent values is detected, and 'colorspace' will be
// adjusted accordingly. Note that this method is lossy.
// Returns false in case of error.
WEBP_EXTERN int WebPPictureARGBToYUVA(WebPPicture* picture,
WebPEncCSP /*colorspace = WEBP_YUV420*/);
// Same as WebPPictureARGBToYUVA(), but the conversion is done using
// pseudo-random dithering with a strength 'dithering' between
// 0.0 (no dithering) and 1.0 (maximum dithering). This is useful
// for photographic picture.
WEBP_EXTERN int WebPPictureARGBToYUVADithered(
WebPPicture* picture, WebPEncCSP colorspace, float dithering);
// Performs 'sharp' RGBA->YUVA420 downsampling and colorspace conversion.
// Downsampling is handled with extra care in case of color clipping. This
// method is roughly 2x slower than WebPPictureARGBToYUVA() but produces better
// and sharper YUV representation.
// Returns false in case of error.
WEBP_EXTERN int WebPPictureSharpARGBToYUVA(WebPPicture* picture);
// kept for backward compatibility:
WEBP_EXTERN int WebPPictureSmartARGBToYUVA(WebPPicture* picture);
// Converts picture->yuv to picture->argb and sets picture->use_argb to true.
// The input format must be YUV_420 or YUV_420A. The conversion from YUV420 to
// ARGB incurs a small loss too.
// Note that the use of this colorspace is discouraged if one has access to the
// raw ARGB samples, since using YUV420 is comparatively lossy.
// Returns false in case of error.
WEBP_EXTERN int WebPPictureYUVAToARGB(WebPPicture* picture);
// Helper function: given a width x height plane of RGBA or YUV(A) samples
// clean-up or smoothen the YUV or RGB samples under fully transparent area,
// to help compressibility (no guarantee, though).
WEBP_EXTERN void WebPCleanupTransparentArea(WebPPicture* picture);
// Scan the picture 'picture' for the presence of non fully opaque alpha values.
// Returns true in such case. Otherwise returns false (indicating that the
// alpha plane can be ignored altogether e.g.).
WEBP_EXTERN int WebPPictureHasTransparency(const WebPPicture* picture);
// Remove the transparency information (if present) by blending the color with
// the background color 'background_rgb' (specified as 24bit RGB triplet).
// After this call, all alpha values are reset to 0xff.
WEBP_EXTERN void WebPBlendAlpha(WebPPicture* picture, uint32_t background_rgb);
//------------------------------------------------------------------------------
// Main call
// Main encoding call, after config and picture have been initialized.
// 'picture' must be less than 16384x16384 in dimension (cf WEBP_MAX_DIMENSION),
// and the 'config' object must be a valid one.
// Returns false in case of error, true otherwise.
// In case of error, picture->error_code is updated accordingly.
// 'picture' can hold the source samples in both YUV(A) or ARGB input, depending
// on the value of 'picture->use_argb'. It is highly recommended to use
// the former for lossy encoding, and the latter for lossless encoding
// (when config.lossless is true). Automatic conversion from one format to
// another is provided but they both incur some loss.
WEBP_EXTERN int WebPEncode(const WebPConfig* config, WebPPicture* picture);
//------------------------------------------------------------------------------
#ifdef __cplusplus
} // extern "C"
#endif
#endif // WEBP_WEBP_ENCODE_H_
@@ -0,0 +1,530 @@
// Copyright 2011 Google Inc. All Rights Reserved.
//
// Use of this source code is governed by a BSD-style license
// that can be found in the COPYING file in the root of the source
// tree. An additional intellectual property rights grant can be found
// in the file PATENTS. All contributing project authors may
// be found in the AUTHORS file in the root of the source tree.
// -----------------------------------------------------------------------------
//
// RIFF container manipulation and encoding for WebP images.
//
// Authors: Urvang (urvang@google.com)
// Vikas (vikasa@google.com)
#ifndef WEBP_WEBP_MUX_H_
#define WEBP_WEBP_MUX_H_
#include "./mux_types.h"
#ifdef __cplusplus
extern "C" {
#endif
#define WEBP_MUX_ABI_VERSION 0x0108 // MAJOR(8b) + MINOR(8b)
//------------------------------------------------------------------------------
// Mux API
//
// This API allows manipulation of WebP container images containing features
// like color profile, metadata, animation.
//
// Code Example#1: Create a WebPMux object with image data, color profile and
// XMP metadata.
/*
int copy_data = 0;
WebPMux* mux = WebPMuxNew();
// ... (Prepare image data).
WebPMuxSetImage(mux, &image, copy_data);
// ... (Prepare ICCP color profile data).
WebPMuxSetChunk(mux, "ICCP", &icc_profile, copy_data);
// ... (Prepare XMP metadata).
WebPMuxSetChunk(mux, "XMP ", &xmp, copy_data);
// Get data from mux in WebP RIFF format.
WebPMuxAssemble(mux, &output_data);
WebPMuxDelete(mux);
// ... (Consume output_data; e.g. write output_data.bytes to file).
WebPDataClear(&output_data);
*/
// Code Example#2: Get image and color profile data from a WebP file.
/*
int copy_data = 0;
// ... (Read data from file).
WebPMux* mux = WebPMuxCreate(&data, copy_data);
WebPMuxGetFrame(mux, 1, &image);
// ... (Consume image; e.g. call WebPDecode() to decode the data).
WebPMuxGetChunk(mux, "ICCP", &icc_profile);
// ... (Consume icc_data).
WebPMuxDelete(mux);
WebPFree(data);
*/
// Note: forward declaring enumerations is not allowed in (strict) C and C++,
// the types are left here for reference.
// typedef enum WebPMuxError WebPMuxError;
// typedef enum WebPChunkId WebPChunkId;
typedef struct WebPMux WebPMux; // main opaque object.
typedef struct WebPMuxFrameInfo WebPMuxFrameInfo;
typedef struct WebPMuxAnimParams WebPMuxAnimParams;
typedef struct WebPAnimEncoderOptions WebPAnimEncoderOptions;
// Error codes
typedef enum WebPMuxError {
WEBP_MUX_OK = 1,
WEBP_MUX_NOT_FOUND = 0,
WEBP_MUX_INVALID_ARGUMENT = -1,
WEBP_MUX_BAD_DATA = -2,
WEBP_MUX_MEMORY_ERROR = -3,
WEBP_MUX_NOT_ENOUGH_DATA = -4
} WebPMuxError;
// IDs for different types of chunks.
typedef enum WebPChunkId {
WEBP_CHUNK_VP8X, // VP8X
WEBP_CHUNK_ICCP, // ICCP
WEBP_CHUNK_ANIM, // ANIM
WEBP_CHUNK_ANMF, // ANMF
WEBP_CHUNK_DEPRECATED, // (deprecated from FRGM)
WEBP_CHUNK_ALPHA, // ALPH
WEBP_CHUNK_IMAGE, // VP8/VP8L
WEBP_CHUNK_EXIF, // EXIF
WEBP_CHUNK_XMP, // XMP
WEBP_CHUNK_UNKNOWN, // Other chunks.
WEBP_CHUNK_NIL
} WebPChunkId;
//------------------------------------------------------------------------------
// Returns the version number of the mux library, packed in hexadecimal using
// 8bits for each of major/minor/revision. E.g: v2.5.7 is 0x020507.
WEBP_EXTERN int WebPGetMuxVersion(void);
//------------------------------------------------------------------------------
// Life of a Mux object
// Internal, version-checked, entry point
WEBP_EXTERN WebPMux* WebPNewInternal(int);
// Creates an empty mux object.
// Returns:
// A pointer to the newly created empty mux object.
// Or NULL in case of memory error.
static WEBP_INLINE WebPMux* WebPMuxNew(void) {
return WebPNewInternal(WEBP_MUX_ABI_VERSION);
}
// Deletes the mux object.
// Parameters:
// mux - (in/out) object to be deleted
WEBP_EXTERN void WebPMuxDelete(WebPMux* mux);
//------------------------------------------------------------------------------
// Mux creation.
// Internal, version-checked, entry point
WEBP_EXTERN WebPMux* WebPMuxCreateInternal(const WebPData*, int, int);
// Creates a mux object from raw data given in WebP RIFF format.
// Parameters:
// bitstream - (in) the bitstream data in WebP RIFF format
// copy_data - (in) value 1 indicates given data WILL be copied to the mux
// object and value 0 indicates data will NOT be copied.
// Returns:
// A pointer to the mux object created from given data - on success.
// NULL - In case of invalid data or memory error.
static WEBP_INLINE WebPMux* WebPMuxCreate(const WebPData* bitstream,
int copy_data) {
return WebPMuxCreateInternal(bitstream, copy_data, WEBP_MUX_ABI_VERSION);
}
//------------------------------------------------------------------------------
// Non-image chunks.
// Note: Only non-image related chunks should be managed through chunk APIs.
// (Image related chunks are: "ANMF", "VP8 ", "VP8L" and "ALPH").
// To add, get and delete images, use WebPMuxSetImage(), WebPMuxPushFrame(),
// WebPMuxGetFrame() and WebPMuxDeleteFrame().
// Adds a chunk with id 'fourcc' and data 'chunk_data' in the mux object.
// Any existing chunk(s) with the same id will be removed.
// Parameters:
// mux - (in/out) object to which the chunk is to be added
// fourcc - (in) a character array containing the fourcc of the given chunk;
// e.g., "ICCP", "XMP ", "EXIF" etc.
// chunk_data - (in) the chunk data to be added
// copy_data - (in) value 1 indicates given data WILL be copied to the mux
// object and value 0 indicates data will NOT be copied.
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux, fourcc or chunk_data is NULL
// or if fourcc corresponds to an image chunk.
// WEBP_MUX_MEMORY_ERROR - on memory allocation error.
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxSetChunk(
WebPMux* mux, const char fourcc[4], const WebPData* chunk_data,
int copy_data);
// Gets a reference to the data of the chunk with id 'fourcc' in the mux object.
// The caller should NOT free the returned data.
// Parameters:
// mux - (in) object from which the chunk data is to be fetched
// fourcc - (in) a character array containing the fourcc of the chunk;
// e.g., "ICCP", "XMP ", "EXIF" etc.
// chunk_data - (out) returned chunk data
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux, fourcc or chunk_data is NULL
// or if fourcc corresponds to an image chunk.
// WEBP_MUX_NOT_FOUND - If mux does not contain a chunk with the given id.
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxGetChunk(
const WebPMux* mux, const char fourcc[4], WebPData* chunk_data);
// Deletes the chunk with the given 'fourcc' from the mux object.
// Parameters:
// mux - (in/out) object from which the chunk is to be deleted
// fourcc - (in) a character array containing the fourcc of the chunk;
// e.g., "ICCP", "XMP ", "EXIF" etc.
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux or fourcc is NULL
// or if fourcc corresponds to an image chunk.
// WEBP_MUX_NOT_FOUND - If mux does not contain a chunk with the given fourcc.
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxDeleteChunk(
WebPMux* mux, const char fourcc[4]);
//------------------------------------------------------------------------------
// Images.
// Encapsulates data about a single frame.
struct WebPMuxFrameInfo {
WebPData bitstream; // image data: can be a raw VP8/VP8L bitstream
// or a single-image WebP file.
int x_offset; // x-offset of the frame.
int y_offset; // y-offset of the frame.
int duration; // duration of the frame (in milliseconds).
WebPChunkId id; // frame type: should be one of WEBP_CHUNK_ANMF
// or WEBP_CHUNK_IMAGE
WebPMuxAnimDispose dispose_method; // Disposal method for the frame.
WebPMuxAnimBlend blend_method; // Blend operation for the frame.
uint32_t pad[1]; // padding for later use
};
// Sets the (non-animated) image in the mux object.
// Note: Any existing images (including frames) will be removed.
// Parameters:
// mux - (in/out) object in which the image is to be set
// bitstream - (in) can be a raw VP8/VP8L bitstream or a single-image
// WebP file (non-animated)
// copy_data - (in) value 1 indicates given data WILL be copied to the mux
// object and value 0 indicates data will NOT be copied.
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux is NULL or bitstream is NULL.
// WEBP_MUX_MEMORY_ERROR - on memory allocation error.
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxSetImage(
WebPMux* mux, const WebPData* bitstream, int copy_data);
// Adds a frame at the end of the mux object.
// Notes: (1) frame.id should be WEBP_CHUNK_ANMF
// (2) For setting a non-animated image, use WebPMuxSetImage() instead.
// (3) Type of frame being pushed must be same as the frames in mux.
// (4) As WebP only supports even offsets, any odd offset will be snapped
// to an even location using: offset &= ~1
// Parameters:
// mux - (in/out) object to which the frame is to be added
// frame - (in) frame data.
// copy_data - (in) value 1 indicates given data WILL be copied to the mux
// object and value 0 indicates data will NOT be copied.
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux or frame is NULL
// or if content of 'frame' is invalid.
// WEBP_MUX_MEMORY_ERROR - on memory allocation error.
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxPushFrame(
WebPMux* mux, const WebPMuxFrameInfo* frame, int copy_data);
// Gets the nth frame from the mux object.
// The content of 'frame->bitstream' is allocated using WebPMalloc(), and NOT
// owned by the 'mux' object. It MUST be deallocated by the caller by calling
// WebPDataClear().
// nth=0 has a special meaning - last position.
// Parameters:
// mux - (in) object from which the info is to be fetched
// nth - (in) index of the frame in the mux object
// frame - (out) data of the returned frame
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux or frame is NULL.
// WEBP_MUX_NOT_FOUND - if there are less than nth frames in the mux object.
// WEBP_MUX_BAD_DATA - if nth frame chunk in mux is invalid.
// WEBP_MUX_MEMORY_ERROR - on memory allocation error.
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxGetFrame(
const WebPMux* mux, uint32_t nth, WebPMuxFrameInfo* frame);
// Deletes a frame from the mux object.
// nth=0 has a special meaning - last position.
// Parameters:
// mux - (in/out) object from which a frame is to be deleted
// nth - (in) The position from which the frame is to be deleted
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux is NULL.
// WEBP_MUX_NOT_FOUND - If there are less than nth frames in the mux object
// before deletion.
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxDeleteFrame(WebPMux* mux, uint32_t nth);
//------------------------------------------------------------------------------
// Animation.
// Animation parameters.
struct WebPMuxAnimParams {
uint32_t bgcolor; // Background color of the canvas stored (in MSB order) as:
// Bits 00 to 07: Alpha.
// Bits 08 to 15: Red.
// Bits 16 to 23: Green.
// Bits 24 to 31: Blue.
int loop_count; // Number of times to repeat the animation [0 = infinite].
};
// Sets the animation parameters in the mux object. Any existing ANIM chunks
// will be removed.
// Parameters:
// mux - (in/out) object in which ANIM chunk is to be set/added
// params - (in) animation parameters.
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux or params is NULL.
// WEBP_MUX_MEMORY_ERROR - on memory allocation error.
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxSetAnimationParams(
WebPMux* mux, const WebPMuxAnimParams* params);
// Gets the animation parameters from the mux object.
// Parameters:
// mux - (in) object from which the animation parameters to be fetched
// params - (out) animation parameters extracted from the ANIM chunk
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux or params is NULL.
// WEBP_MUX_NOT_FOUND - if ANIM chunk is not present in mux object.
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxGetAnimationParams(
const WebPMux* mux, WebPMuxAnimParams* params);
//------------------------------------------------------------------------------
// Misc Utilities.
// Sets the canvas size for the mux object. The width and height can be
// specified explicitly or left as zero (0, 0).
// * When width and height are specified explicitly, then this frame bound is
// enforced during subsequent calls to WebPMuxAssemble() and an error is
// reported if any animated frame does not completely fit within the canvas.
// * When unspecified (0, 0), the constructed canvas will get the frame bounds
// from the bounding-box over all frames after calling WebPMuxAssemble().
// Parameters:
// mux - (in) object to which the canvas size is to be set
// width - (in) canvas width
// height - (in) canvas height
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux is NULL; or
// width or height are invalid or out of bounds
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxSetCanvasSize(WebPMux* mux,
int width, int height);
// Gets the canvas size from the mux object.
// Note: This method assumes that the VP8X chunk, if present, is up-to-date.
// That is, the mux object hasn't been modified since the last call to
// WebPMuxAssemble() or WebPMuxCreate().
// Parameters:
// mux - (in) object from which the canvas size is to be fetched
// width - (out) canvas width
// height - (out) canvas height
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux, width or height is NULL.
// WEBP_MUX_BAD_DATA - if VP8X/VP8/VP8L chunk or canvas size is invalid.
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxGetCanvasSize(const WebPMux* mux,
int* width, int* height);
// Gets the feature flags from the mux object.
// Note: This method assumes that the VP8X chunk, if present, is up-to-date.
// That is, the mux object hasn't been modified since the last call to
// WebPMuxAssemble() or WebPMuxCreate().
// Parameters:
// mux - (in) object from which the features are to be fetched
// flags - (out) the flags specifying which features are present in the
// mux object. This will be an OR of various flag values.
// Enum 'WebPFeatureFlags' can be used to test individual flag values.
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux or flags is NULL.
// WEBP_MUX_BAD_DATA - if VP8X/VP8/VP8L chunk or canvas size is invalid.
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxGetFeatures(const WebPMux* mux,
uint32_t* flags);
// Gets number of chunks with the given 'id' in the mux object.
// Parameters:
// mux - (in) object from which the info is to be fetched
// id - (in) chunk id specifying the type of chunk
// num_elements - (out) number of chunks with the given chunk id
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux, or num_elements is NULL.
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxNumChunks(const WebPMux* mux,
WebPChunkId id, int* num_elements);
// Assembles all chunks in WebP RIFF format and returns in 'assembled_data'.
// This function also validates the mux object.
// Note: The content of 'assembled_data' will be ignored and overwritten.
// Also, the content of 'assembled_data' is allocated using WebPMalloc(), and
// NOT owned by the 'mux' object. It MUST be deallocated by the caller by
// calling WebPDataClear(). It's always safe to call WebPDataClear() upon
// return, even in case of error.
// Parameters:
// mux - (in/out) object whose chunks are to be assembled
// assembled_data - (out) assembled WebP data
// Returns:
// WEBP_MUX_BAD_DATA - if mux object is invalid.
// WEBP_MUX_INVALID_ARGUMENT - if mux or assembled_data is NULL.
// WEBP_MUX_MEMORY_ERROR - on memory allocation error.
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxAssemble(WebPMux* mux,
WebPData* assembled_data);
//------------------------------------------------------------------------------
// WebPAnimEncoder API
//
// This API allows encoding (possibly) animated WebP images.
//
// Code Example:
/*
WebPAnimEncoderOptions enc_options;
WebPAnimEncoderOptionsInit(&enc_options);
// Tune 'enc_options' as needed.
WebPAnimEncoder* enc = WebPAnimEncoderNew(width, height, &enc_options);
while(<there are more frames>) {
WebPConfig config;
WebPConfigInit(&config);
// Tune 'config' as needed.
WebPAnimEncoderAdd(enc, frame, timestamp_ms, &config);
}
WebPAnimEncoderAdd(enc, NULL, timestamp_ms, NULL);
WebPAnimEncoderAssemble(enc, webp_data);
WebPAnimEncoderDelete(enc);
// Write the 'webp_data' to a file, or re-mux it further.
*/
typedef struct WebPAnimEncoder WebPAnimEncoder; // Main opaque object.
// Forward declarations. Defined in encode.h.
struct WebPPicture;
struct WebPConfig;
// Global options.
struct WebPAnimEncoderOptions {
WebPMuxAnimParams anim_params; // Animation parameters.
int minimize_size; // If true, minimize the output size (slow). Implicitly
// disables key-frame insertion.
int kmin;
int kmax; // Minimum and maximum distance between consecutive key
// frames in the output. The library may insert some key
// frames as needed to satisfy this criteria.
// Note that these conditions should hold: kmax > kmin
// and kmin >= kmax / 2 + 1. Also, if kmax <= 0, then
// key-frame insertion is disabled; and if kmax == 1,
// then all frames will be key-frames (kmin value does
// not matter for these special cases).
int allow_mixed; // If true, use mixed compression mode; may choose
// either lossy and lossless for each frame.
int verbose; // If true, print info and warning messages to stderr.
uint32_t padding[4]; // Padding for later use.
};
// Internal, version-checked, entry point.
WEBP_EXTERN int WebPAnimEncoderOptionsInitInternal(
WebPAnimEncoderOptions*, int);
// Should always be called, to initialize a fresh WebPAnimEncoderOptions
// structure before modification. Returns false in case of version mismatch.
// WebPAnimEncoderOptionsInit() must have succeeded before using the
// 'enc_options' object.
static WEBP_INLINE int WebPAnimEncoderOptionsInit(
WebPAnimEncoderOptions* enc_options) {
return WebPAnimEncoderOptionsInitInternal(enc_options, WEBP_MUX_ABI_VERSION);
}
// Internal, version-checked, entry point.
WEBP_EXTERN WebPAnimEncoder* WebPAnimEncoderNewInternal(
int, int, const WebPAnimEncoderOptions*, int);
// Creates and initializes a WebPAnimEncoder object.
// Parameters:
// width/height - (in) canvas width and height of the animation.
// enc_options - (in) encoding options; can be passed NULL to pick
// reasonable defaults.
// Returns:
// A pointer to the newly created WebPAnimEncoder object.
// Or NULL in case of memory error.
static WEBP_INLINE WebPAnimEncoder* WebPAnimEncoderNew(
int width, int height, const WebPAnimEncoderOptions* enc_options) {
return WebPAnimEncoderNewInternal(width, height, enc_options,
WEBP_MUX_ABI_VERSION);
}
// Optimize the given frame for WebP, encode it and add it to the
// WebPAnimEncoder object.
// The last call to 'WebPAnimEncoderAdd' should be with frame = NULL, which
// indicates that no more frames are to be added. This call is also used to
// determine the duration of the last frame.
// Parameters:
// enc - (in/out) object to which the frame is to be added.
// frame - (in/out) frame data in ARGB or YUV(A) format. If it is in YUV(A)
// format, it will be converted to ARGB, which incurs a small loss.
// timestamp_ms - (in) timestamp of this frame in milliseconds.
// Duration of a frame would be calculated as
// "timestamp of next frame - timestamp of this frame".
// Hence, timestamps should be in non-decreasing order.
// config - (in) encoding options; can be passed NULL to pick
// reasonable defaults.
// Returns:
// On error, returns false and frame->error_code is set appropriately.
// Otherwise, returns true.
WEBP_EXTERN int WebPAnimEncoderAdd(
WebPAnimEncoder* enc, struct WebPPicture* frame, int timestamp_ms,
const struct WebPConfig* config);
// Assemble all frames added so far into a WebP bitstream.
// This call should be preceded by a call to 'WebPAnimEncoderAdd' with
// frame = NULL; if not, the duration of the last frame will be internally
// estimated.
// Parameters:
// enc - (in/out) object from which the frames are to be assembled.
// webp_data - (out) generated WebP bitstream.
// Returns:
// True on success.
WEBP_EXTERN int WebPAnimEncoderAssemble(WebPAnimEncoder* enc,
WebPData* webp_data);
// Get error string corresponding to the most recent call using 'enc'. The
// returned string is owned by 'enc' and is valid only until the next call to
// WebPAnimEncoderAdd() or WebPAnimEncoderAssemble() or WebPAnimEncoderDelete().
// Parameters:
// enc - (in/out) object from which the error string is to be fetched.
// Returns:
// NULL if 'enc' is NULL. Otherwise, returns the error string if the last call
// to 'enc' had an error, or an empty string if the last call was a success.
WEBP_EXTERN const char* WebPAnimEncoderGetError(WebPAnimEncoder* enc);
// Deletes the WebPAnimEncoder object.
// Parameters:
// enc - (in/out) object to be deleted
WEBP_EXTERN void WebPAnimEncoderDelete(WebPAnimEncoder* enc);
//------------------------------------------------------------------------------
#ifdef __cplusplus
} // extern "C"
#endif
#endif // WEBP_WEBP_MUX_H_
@@ -0,0 +1,98 @@
// Copyright 2012 Google Inc. All Rights Reserved.
//
// Use of this source code is governed by a BSD-style license
// that can be found in the COPYING file in the root of the source
// tree. An additional intellectual property rights grant can be found
// in the file PATENTS. All contributing project authors may
// be found in the AUTHORS file in the root of the source tree.
// -----------------------------------------------------------------------------
//
// Data-types common to the mux and demux libraries.
//
// Author: Urvang (urvang@google.com)
#ifndef WEBP_WEBP_MUX_TYPES_H_
#define WEBP_WEBP_MUX_TYPES_H_
#include <string.h> // memset()
#include "./types.h"
#ifdef __cplusplus
extern "C" {
#endif
// Note: forward declaring enumerations is not allowed in (strict) C and C++,
// the types are left here for reference.
// typedef enum WebPFeatureFlags WebPFeatureFlags;
// typedef enum WebPMuxAnimDispose WebPMuxAnimDispose;
// typedef enum WebPMuxAnimBlend WebPMuxAnimBlend;
typedef struct WebPData WebPData;
// VP8X Feature Flags.
typedef enum WebPFeatureFlags {
ANIMATION_FLAG = 0x00000002,
XMP_FLAG = 0x00000004,
EXIF_FLAG = 0x00000008,
ALPHA_FLAG = 0x00000010,
ICCP_FLAG = 0x00000020,
ALL_VALID_FLAGS = 0x0000003e
} WebPFeatureFlags;
// Dispose method (animation only). Indicates how the area used by the current
// frame is to be treated before rendering the next frame on the canvas.
typedef enum WebPMuxAnimDispose {
WEBP_MUX_DISPOSE_NONE, // Do not dispose.
WEBP_MUX_DISPOSE_BACKGROUND // Dispose to background color.
} WebPMuxAnimDispose;
// Blend operation (animation only). Indicates how transparent pixels of the
// current frame are blended with those of the previous canvas.
typedef enum WebPMuxAnimBlend {
WEBP_MUX_BLEND, // Blend.
WEBP_MUX_NO_BLEND // Do not blend.
} WebPMuxAnimBlend;
// Data type used to describe 'raw' data, e.g., chunk data
// (ICC profile, metadata) and WebP compressed image data.
// 'bytes' memory must be allocated using WebPMalloc() and such.
struct WebPData {
const uint8_t* bytes;
size_t size;
};
// Initializes the contents of the 'webp_data' object with default values.
static WEBP_INLINE void WebPDataInit(WebPData* webp_data) {
if (webp_data != NULL) {
memset(webp_data, 0, sizeof(*webp_data));
}
}
// Clears the contents of the 'webp_data' object by calling WebPFree().
// Does not deallocate the object itself.
static WEBP_INLINE void WebPDataClear(WebPData* webp_data) {
if (webp_data != NULL) {
WebPFree((void*)webp_data->bytes);
WebPDataInit(webp_data);
}
}
// Allocates necessary storage for 'dst' and copies the contents of 'src'.
// Returns true on success.
static WEBP_INLINE int WebPDataCopy(const WebPData* src, WebPData* dst) {
if (src == NULL || dst == NULL) return 0;
WebPDataInit(dst);
if (src->bytes != NULL && src->size != 0) {
dst->bytes = (uint8_t*)WebPMalloc(src->size);
if (dst->bytes == NULL) return 0;
memcpy((void*)dst->bytes, src->bytes, src->size);
dst->size = src->size;
}
return 1;
}
#ifdef __cplusplus
} // extern "C"
#endif
#endif // WEBP_WEBP_MUX_TYPES_H_
@@ -0,0 +1,68 @@
// Copyright 2010 Google Inc. All Rights Reserved.
//
// Use of this source code is governed by a BSD-style license
// that can be found in the COPYING file in the root of the source
// tree. An additional intellectual property rights grant can be found
// in the file PATENTS. All contributing project authors may
// be found in the AUTHORS file in the root of the source tree.
// -----------------------------------------------------------------------------
//
// Common types + memory wrappers
//
// Author: Skal (pascal.massimino@gmail.com)
#ifndef WEBP_WEBP_TYPES_H_
#define WEBP_WEBP_TYPES_H_
#include <stddef.h> // for size_t
#ifndef _MSC_VER
#include <inttypes.h>
#if defined(__cplusplus) || !defined(__STRICT_ANSI__) || \
(defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L)
#define WEBP_INLINE inline
#else
#define WEBP_INLINE
#endif
#else
typedef signed char int8_t;
typedef unsigned char uint8_t;
typedef signed short int16_t;
typedef unsigned short uint16_t;
typedef signed int int32_t;
typedef unsigned int uint32_t;
typedef unsigned long long int uint64_t;
typedef long long int int64_t;
#define WEBP_INLINE __forceinline
#endif /* _MSC_VER */
#ifndef WEBP_EXTERN
// This explicitly marks library functions and allows for changing the
// signature for e.g., Windows DLL builds.
# if defined(__GNUC__) && __GNUC__ >= 4
# define WEBP_EXTERN extern __attribute__ ((visibility ("default")))
# else
# define WEBP_EXTERN extern
# endif /* __GNUC__ >= 4 */
#endif /* WEBP_EXTERN */
// Macro to check ABI compatibility (same major revision number)
#define WEBP_ABI_IS_INCOMPATIBLE(a, b) (((a) >> 8) != ((b) >> 8))
#ifdef __cplusplus
extern "C" {
#endif
// Allocates 'size' bytes of memory. Returns NULL upon error. Memory
// must be deallocated by calling WebPFree(). This function is made available
// by the core 'libwebp' library.
WEBP_EXTERN void* WebPMalloc(size_t size);
// Releases memory returned by the WebPDecode*() functions (from decode.h).
WEBP_EXTERN void WebPFree(void* ptr);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // WEBP_WEBP_TYPES_H_
@@ -0,0 +1,29 @@
# How to Contribute
We'd love to accept your patches and contributions to this project. There are
just a few small guidelines you need to follow.
## Contributor License Agreement
Contributions to this project must be accompanied by a Contributor License
Agreement. You (or your employer) retain the copyright to your contribution;
this simply gives us permission to use and redistribute your contributions as
part of the project. Head over to <https://cla.developers.google.com/> to see
your current agreements on file or to sign a new one.
You generally only need to submit a CLA once, so if you've already submitted one
(even if it was for a different project), you probably don't need to do it
again.
## Code reviews
All submissions, including submissions by project members, require review. We
use a [Gerrit](https://www.gerritcodereview.com) instance hosted at
https://chromium-review.googlesource.com for this purpose. See the
[WebM Project page](https://www.webmproject.org/code/contribute/submitting-patches/)
for additional details.
## Community Guidelines
This project follows
[Google's Open Source Community Guidelines](https://opensource.google.com/conduct/).
@@ -0,0 +1,65 @@
# WebP Codec
```
__ __ ____ ____ ____
/ \\/ \/ _ \/ _ )/ _ \
\ / __/ _ \ __/
\__\__/\____/\_____/__/ ____ ___
/ _/ / \ \ / _ \/ _/
/ \_/ / / \ \ __/ \__
\____/____/\_____/_____/____/v1.2.4
```
WebP codec is a 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' to compress and decompress
images respectively.
See https://developers.google.com/speed/webp for details on the image format.
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
https://www.webmproject.org/license/software/ or the "COPYING" file for details.
An additional intellectual property rights grant can be found in the file
PATENTS.
## Files
* bin/cwebp : encoding tool
* bin/dwebp : decoding tool
* bin/gif2webp : gif conversion tool
* bin/img2webp : animation creation tool
* bin/vwebp : webp visualization tool
* bin/webpinfo : webp analysis tool
* bin/webpmux : webp muxing tool
* bin/anim\_diff : webp file comparison tool
* bin/anim\_dump : tool for dumping animation frames
* bin/get\_disto : tool for calculating file distortion
* bin/webp\_quality : webp quality estimation tool
* doc/ : manual in HTML and text formats
* lib/ : static libraries
* include/webp : headers
## Encoding and Decoding Tools
The bin/ directory contains tools to encode and decode images and animations,
view information about WebP images, and more. See the
[tools documentation](doc/tools.md).
## APIs
See the [APIs documentation](doc/api.md).
## Bugs
Please report all bugs to the issue tracker: https://bugs.chromium.org/p/webp
Patches welcome! See [how to contribute](CONTRIBUTING.md).
## Discuss
Email: webp-discuss@webmproject.org
Web: https://groups.google.com/a/webmproject.org/group/webp-discuss
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,385 @@
# WebP APIs
## Encoding API
The main encoding functions are available in the header src/webp/encode.h
The ready-to-use ones are:
```c
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:
```c
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:
```c
#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 (!WebPPictureAlloc(&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);
```
## Decoding API
This is mainly just one function to call:
```c
#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:
```c
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:
```c
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:
```c
WebPIAppend(idec, fresh_data, size_of_fresh_data);
```
or by just mentioning the new size of the transmitted data:
```c
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.
```c
// 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);
```
## Webp Mux
WebPMux is a set of two libraries 'Mux' and 'Demux' for creation, extraction and
manipulation of an extended format WebP file, which can have features like color
profile, metadata and animation. Reference command-line tools `webpmux` and
`vwebp` as well as the WebP container specification
'doc/webp-container-spec.txt' are also provided in this package, see the
[tools documentation](tools.md).
### Mux API
The Mux API contains methods for adding data to and reading data from WebP
files. This API currently supports XMP/EXIF metadata, ICC profile and animation.
Other features may be added in subsequent releases.
Example#1 (pseudo code): Creating a WebPMux object with image data, color
profile and XMP metadata.
```c
int copy_data = 0;
WebPMux* mux = WebPMuxNew();
// ... (Prepare image data).
WebPMuxSetImage(mux, &image, copy_data);
// ... (Prepare ICC profile data).
WebPMuxSetChunk(mux, "ICCP", &icc_profile, copy_data);
// ... (Prepare XMP metadata).
WebPMuxSetChunk(mux, "XMP ", &xmp, copy_data);
// Get data from mux in WebP RIFF format.
WebPMuxAssemble(mux, &output_data);
WebPMuxDelete(mux);
// ... (Consume output_data; e.g. write output_data.bytes to file).
WebPDataClear(&output_data);
```
Example#2 (pseudo code): Get image and color profile data from a WebP file.
```c
int copy_data = 0;
// ... (Read data from file).
WebPMux* mux = WebPMuxCreate(&data, copy_data);
WebPMuxGetFrame(mux, 1, &image);
// ... (Consume image; e.g. call WebPDecode() to decode the data).
WebPMuxGetChunk(mux, "ICCP", &icc_profile);
// ... (Consume icc_profile).
WebPMuxDelete(mux);
free(data);
```
For a detailed Mux API reference, please refer to the header file
(src/webp/mux.h).
### Demux API
The Demux API enables extraction of images and extended format data from WebP
files. This API currently supports reading of XMP/EXIF metadata, ICC profile and
animated images. Other features may be added in subsequent releases.
Code example: Demuxing WebP data to extract all the frames, ICC profile and
EXIF/XMP metadata.
```c
WebPDemuxer* demux = WebPDemux(&webp_data);
uint32_t width = WebPDemuxGetI(demux, WEBP_FF_CANVAS_WIDTH);
uint32_t height = WebPDemuxGetI(demux, WEBP_FF_CANVAS_HEIGHT);
// ... (Get information about the features present in the WebP file).
uint32_t flags = WebPDemuxGetI(demux, WEBP_FF_FORMAT_FLAGS);
// ... (Iterate over all frames).
WebPIterator iter;
if (WebPDemuxGetFrame(demux, 1, &iter)) {
do {
// ... (Consume 'iter'; e.g. Decode 'iter.fragment' with WebPDecode(),
// ... and get other frame properties like width, height, offsets etc.
// ... see 'struct WebPIterator' below for more info).
} while (WebPDemuxNextFrame(&iter));
WebPDemuxReleaseIterator(&iter);
}
// ... (Extract metadata).
WebPChunkIterator chunk_iter;
if (flags & ICCP_FLAG) WebPDemuxGetChunk(demux, "ICCP", 1, &chunk_iter);
// ... (Consume the ICC profile in 'chunk_iter.chunk').
WebPDemuxReleaseChunkIterator(&chunk_iter);
if (flags & EXIF_FLAG) WebPDemuxGetChunk(demux, "EXIF", 1, &chunk_iter);
// ... (Consume the EXIF metadata in 'chunk_iter.chunk').
WebPDemuxReleaseChunkIterator(&chunk_iter);
if (flags & XMP_FLAG) WebPDemuxGetChunk(demux, "XMP ", 1, &chunk_iter);
// ... (Consume the XMP metadata in 'chunk_iter.chunk').
WebPDemuxReleaseChunkIterator(&chunk_iter);
WebPDemuxDelete(demux);
```
For a detailed Demux API reference, please refer to the header file
(src/webp/demux.h).
## AnimEncoder API
The AnimEncoder API can be used to create animated WebP images.
Code example:
```c
WebPAnimEncoderOptions enc_options;
WebPAnimEncoderOptionsInit(&enc_options);
// ... (Tune 'enc_options' as needed).
WebPAnimEncoder* enc = WebPAnimEncoderNew(width, height, &enc_options);
while(<there are more frames>) {
WebPConfig config;
WebPConfigInit(&config);
// ... (Tune 'config' as needed).
WebPAnimEncoderAdd(enc, frame, duration, &config);
}
WebPAnimEncoderAssemble(enc, webp_data);
WebPAnimEncoderDelete(enc);
// ... (Write the 'webp_data' to a file, or re-mux it further).
```
For a detailed AnimEncoder API reference, please refer to the header file
(src/webp/mux.h).
## AnimDecoder API
This AnimDecoder API allows decoding (possibly) animated WebP images.
Code Example:
```c
WebPAnimDecoderOptions dec_options;
WebPAnimDecoderOptionsInit(&dec_options);
// Tune 'dec_options' as needed.
WebPAnimDecoder* dec = WebPAnimDecoderNew(webp_data, &dec_options);
WebPAnimInfo anim_info;
WebPAnimDecoderGetInfo(dec, &anim_info);
for (uint32_t i = 0; i < anim_info.loop_count; ++i) {
while (WebPAnimDecoderHasMoreFrames(dec)) {
uint8_t* buf;
int timestamp;
WebPAnimDecoderGetNext(dec, &buf, &timestamp);
// ... (Render 'buf' based on 'timestamp').
// ... (Do NOT free 'buf', as it is owned by 'dec').
}
WebPAnimDecoderReset(dec);
}
const WebPDemuxer* demuxer = WebPAnimDecoderGetDemuxer(dec);
// ... (Do something using 'demuxer'; e.g. get EXIF/XMP/ICC data).
WebPAnimDecoderDelete(dec);
```
For a detailed AnimDecoder API reference, please refer to the header file
(src/webp/demux.h).
@@ -0,0 +1,663 @@
<!-- Creator : groff version 1.19.2 -->
<!-- CreationDate: Fri Aug 5 18:48:54 2022 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="generator" content="groff -Thtml, see www.gnu.org">
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<meta name="Content-Style" content="text/css">
<style type="text/css">
p { margin-top: 0; margin-bottom: 0; }
pre { margin-top: 0; margin-bottom: 0; }
table { margin-top: 0; margin-bottom: 0; }
</style>
<title>CWEBP</title>
</head>
<body>
<h1 align=center>CWEBP</h1>
<a href="#NAME">NAME</a><br>
<a href="#SYNOPSIS">SYNOPSIS</a><br>
<a href="#DESCRIPTION">DESCRIPTION</a><br>
<a href="#OPTIONS">OPTIONS</a><br>
<a href="#BUGS">BUGS</a><br>
<a href="#EXAMPLES">EXAMPLES</a><br>
<a href="#AUTHORS">AUTHORS</a><br>
<a href="#SEE ALSO">SEE ALSO</a><br>
<hr>
<a name="NAME"></a>
<h2>NAME</h2>
<p style="margin-left:11%; margin-top: 1em">cwebp &minus;
compress an image file to a WebP file</p>
<a name="SYNOPSIS"></a>
<h2>SYNOPSIS</h2>
<p style="margin-left:11%; margin-top: 1em"><b>cwebp</b>
[<i>options</i>] <i>input_file &minus;o
output_file.webp</i></p>
<a name="DESCRIPTION"></a>
<h2>DESCRIPTION</h2>
<p style="margin-left:11%; margin-top: 1em">This manual
page documents the <b>cwebp</b> command.</p>
<p style="margin-left:11%; margin-top: 1em"><b>cwebp</b>
compresses an image using the WebP format. Input format can
be either PNG, JPEG, TIFF, WebP or raw Y&rsquo;CbCr samples.
Note: Animated PNG and WebP files are not supported.</p>
<a name="OPTIONS"></a>
<h2>OPTIONS</h2>
<p style="margin-left:11%; margin-top: 1em">The basic
options are: <b><br>
&minus;o</b> <i>string</i></p>
<p style="margin-left:22%;">Specify the name of the output
WebP file. If omitted, <b>cwebp</b> will perform compression
but only report statistics. Using &quot;&minus;&quot; as
output name will direct output to &rsquo;stdout&rsquo;.</p>
<p style="margin-left:11%;"><b>&minus;&minus;</b>
<i>string</i></p>
<p style="margin-left:22%;">Explicitly specify the input
file. This option is useful if the input file starts with a
&rsquo;&minus;&rsquo; for instance. This option must appear
<b>last</b>. Any other options afterward will be
ignored.</p>
<p style="margin-left:11%;"><b>&minus;h,
&minus;help</b></p>
<p style="margin-left:22%;">A short usage summary.</p>
<p style="margin-left:11%;"><b>&minus;H,
&minus;longhelp</b></p>
<p style="margin-left:22%;">A summary of all the possible
options.</p>
<p style="margin-left:11%;"><b>&minus;version</b></p>
<p style="margin-left:22%;">Print the version number (as
major.minor.revision) and exit.</p>
<p style="margin-left:11%;"><b>&minus;lossless</b></p>
<p style="margin-left:22%;">Encode the image without any
loss. For images with fully transparent area, the invisible
pixel values (R/G/B or Y/U/V) will be preserved only if the
&minus;exact option is used.</p>
<p style="margin-left:11%;"><b>&minus;near_lossless</b>
<i>int</i></p>
<p style="margin-left:22%;">Specify the level of
near&minus;lossless image preprocessing. This option adjusts
pixel values to help compressibility, but has minimal impact
on the visual quality. It triggers lossless compression mode
automatically. The range is 0 (maximum preprocessing) to 100
(no preprocessing, the default). The typical value is around
60. Note that lossy with <b>&minus;q 100</b> can at times
yield better results.</p>
<p style="margin-left:11%;"><b>&minus;q</b>
<i>float</i></p>
<p style="margin-left:22%;">Specify the compression factor
for RGB channels between 0 and 100. The default is 75. <br>
In case of lossy compression (default), a small factor
produces a smaller file with lower quality. Best quality is
achieved by using a value of 100. <br>
In case of lossless compression (specified by the
<b>&minus;lossless</b> option), a small factor enables
faster compression speed, but produces a larger file.
Maximum compression is achieved by using a value of 100.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;z</b>
<i>int</i></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Switch on
<b>lossless</b> compression mode with the specified level
between 0 and 9, with level 0 being the fastest, 9 being the
slowest. Fast mode produces larger file size than slower
ones. A good default is <b>&minus;z 6</b>. This option is
actually a shortcut for some predefined settings for quality
and method. If options <b>&minus;q</b> or <b>&minus;m</b>
are subsequently used, they will invalidate the effect of
this option.</p></td>
</table>
<p style="margin-left:11%;"><b>&minus;alpha_q</b>
<i>int</i></p>
<p style="margin-left:22%;">Specify the compression factor
for alpha compression between 0 and 100. Lossless
compression of alpha is achieved using a value of 100, while
the lower values result in a lossy compression. The default
is 100.</p>
<p style="margin-left:11%;"><b>&minus;preset</b>
<i>string</i></p>
<p style="margin-left:22%;">Specify a set of
pre&minus;defined parameters to suit a particular type of
source material. Possible values are: <b>default</b>,
<b>photo</b>, <b>picture</b>, <b>drawing</b>, <b>icon</b>,
<b>text</b>. Since <b>&minus;preset</b> overwrites the other
parameters&rsquo; values (except the <b>&minus;q</b> one),
this option should preferably appear first in the order of
the arguments.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;m</b>
<i>int</i></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Specify the
compression method to use. This parameter controls the trade
off between encoding speed and the compressed file size and
quality. Possible values range from 0 to 6. Default value is
4. When higher values are used, the encoder will spend more
time inspecting additional encoding possibilities and decide
on the quality gain. Lower value can result in faster
processing time at the expense of larger file size and lower
compression quality.</p></td>
</table>
<p style="margin-left:11%;"><b>&minus;crop</b>
<i>x_position y_position width height</i></p>
<p style="margin-left:22%;">Crop the source to a rectangle
with top&minus;left corner at coordinates
(<b>x_position</b>, <b>y_position</b>) and size <b>width</b>
x <b>height</b>. This cropping area must be fully contained
within the source rectangle. Note: the cropping is applied
<i>before</i> any scaling.</p>
<p style="margin-left:11%;"><b>&minus;resize</b> <i>width
height</i></p>
<p style="margin-left:22%;">Resize the source to a
rectangle with size <b>width</b> x <b>height</b>. If either
(but not both) of the <b>width</b> or <b>height</b>
parameters is 0, the value will be calculated preserving the
aspect&minus;ratio. Note: scaling is applied <i>after</i>
cropping.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="4%">
<p style="margin-top: 1em" valign="top"><b>&minus;mt</b></p> </td>
<td width="7%"></td>
<td width="70%">
<p style="margin-top: 1em" valign="top">Use
multi&minus;threading for encoding, if possible.</p></td>
<td width="8%">
</td>
</table>
<p style="margin-left:11%;"><b>&minus;low_memory</b></p>
<p style="margin-left:22%;">Reduce memory usage of lossy
encoding by saving four times the compressed size
(typically). This will make the encoding slower and the
output slightly different in size and distortion. This flag
is only effective for methods 3 and up, and is off by
default. Note that leaving this flag off will have some side
effects on the bitstream: it forces certain bitstream
features like number of partitions (forced to 1). Note that
a more detailed report of bitstream size is printed by
<b>cwebp</b> when using this option.</p>
<p style="margin-left:11%; margin-top: 1em"><b>LOSSY
OPTIONS</b> <br>
These options are only effective when doing lossy encoding
(the default, with or without alpha). <b><br>
&minus;size</b> <i>int</i></p>
<p style="margin-left:22%;">Specify a target size (in
bytes) to try and reach for the compressed output. The
compressor will make several passes of partial encoding in
order to get as close as possible to this target. If both
<b>&minus;size</b> and <b>&minus;psnr</b> are used,
<b>&minus;size</b> value will prevail.</p>
<p style="margin-left:11%;"><b>&minus;psnr</b>
<i>float</i></p>
<p style="margin-left:22%;">Specify a target PSNR (in dB)
to try and reach for the compressed output. The compressor
will make several passes of partial encoding in order to get
as close as possible to this target. If both
<b>&minus;size</b> and <b>&minus;psnr</b> are used,
<b>&minus;size</b> value will prevail.</p>
<p style="margin-left:11%;"><b>&minus;pass</b>
<i>int</i></p>
<p style="margin-left:22%;">Set a maximum number of passes
to use during the dichotomy used by options
<b>&minus;size</b> or <b>&minus;psnr</b>. Maximum value is
10, default is 1. If options <b>&minus;size</b> or
<b>&minus;psnr</b> were used, but <b>&minus;pass</b>
wasn&rsquo;t specified, a default value of &rsquo;6&rsquo;
passes will be used.</p>
<p style="margin-left:11%;"><b>&minus;qrange</b> <i>int
int</i></p>
<p style="margin-left:22%;">Specifies the permissible
interval for the quality factor. This is particularly useful
when using multi-pass (<b>&minus;size</b> or
<b>&minus;psnr</b> options). Default is 0 100. If the
quality factor is outside this range, it will be clamped. If
the minimum value must be less or equal to the maximum
one.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="4%">
<p style="margin-top: 1em" valign="top"><b>&minus;af</b></p> </td>
<td width="7%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Turns
auto&minus;filter on. This algorithm will spend additional
time optimizing the filtering strength to reach a
well&minus;balanced quality.</p></td>
</table>
<p style="margin-left:11%;"><b>&minus;jpeg_like</b></p>
<p style="margin-left:22%;">Change the internal parameter
mapping to better match the expected size of JPEG
compression. This flag will generally produce an output file
of similar size to its JPEG equivalent (for the same
<b>&minus;q</b> setting), but with less visual
distortion.</p>
<p style="margin-left:11%;">Advanced options:</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;f</b>
<i>int</i></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Specify the
strength of the deblocking filter, between 0 (no filtering)
and 100 (maximum filtering). A value of 0 will turn off any
filtering. Higher value will increase the strength of the
filtering process applied after decoding the picture. The
higher the value the smoother the picture will appear.
Typical values are usually in the range of 20 to 50.</p></td>
</table>
<p style="margin-left:11%;"><b>&minus;sharpness</b>
<i>int</i></p>
<p style="margin-left:22%;">Specify the sharpness of the
filtering (if used). Range is 0 (sharpest) to 7 (least
sharp). Default is 0.</p>
<p style="margin-left:11%;"><b>&minus;strong</b></p>
<p style="margin-left:22%;">Use strong filtering (if
filtering is being used thanks to the <b>&minus;f</b>
option). Strong filtering is on by default.</p>
<p style="margin-left:11%;"><b>&minus;nostrong</b></p>
<p style="margin-left:22%;">Disable strong filtering (if
filtering is being used thanks to the <b>&minus;f</b>
option) and use simple filtering instead.</p>
<p style="margin-left:11%;"><b>&minus;sharp_yuv</b></p>
<p style="margin-left:22%;">Use more accurate and sharper
RGB-&gt;YUV conversion if needed. Note that this process is
slower than the default &rsquo;fast&rsquo; RGB-&gt;YUV
conversion.</p>
<p style="margin-left:11%;"><b>&minus;sns</b>
<i>int</i></p>
<p style="margin-left:22%;">Specify the amplitude of the
spatial noise shaping. Spatial noise shaping (or <b>sns</b>
for short) refers to a general collection of built&minus;in
algorithms used to decide which area of the picture should
use relatively less bits, and where else to better transfer
these bits. The possible range goes from 0 (algorithm is
off) to 100 (the maximal effect). The default value is
50.</p>
<p style="margin-left:11%;"><b>&minus;segments</b>
<i>int</i></p>
<p style="margin-left:22%;">Change the number of partitions
to use during the segmentation of the sns algorithm.
Segments should be in range 1 to 4. Default value is 4. This
option has no effect for methods 3 and up, unless
<b>&minus;low_memory</b> is used.</p>
<p style="margin-left:11%;"><b>&minus;partition_limit</b>
<i>int</i></p>
<p style="margin-left:22%;">Degrade quality by limiting the
number of bits used by some macroblocks. Range is 0 (no
degradation, the default) to 100 (full degradation). Useful
values are usually around 30&minus;70 for moderately large
images. In the VP8 format, the so&minus;called control
partition has a limit of 512k and is used to store the
following information: whether the macroblock is skipped,
which segment it belongs to, whether it is coded as intra
4x4 or intra 16x16 mode, and finally the prediction modes to
use for each of the sub&minus;blocks. For a very large
image, 512k only leaves room to few bits per 16x16
macroblock. The absolute minimum is 4 bits per macroblock.
Skip, segment, and mode information can use up almost all
these 4 bits (although the case is unlikely), which is
problematic for very large images. The partition_limit
factor controls how frequently the most bit&minus;costly
mode (intra 4x4) will be used. This is useful in case the
512k limit is reached and the following message is
displayed: <i>Error code: 6 (PARTITION0_OVERFLOW: Partition
#0 is too big to fit 512k)</i>. If using
<b>&minus;partition_limit</b> is not enough to meet the 512k
constraint, one should use less segments in order to save
more header bits per macroblock. See the
<b>&minus;segments</b> option.</p>
<p style="margin-left:11%; margin-top: 1em"><b>LOGGING
OPTIONS</b> <br>
These options control the level of output:</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="3%">
<p style="margin-top: 1em" valign="top"><b>&minus;v</b></p> </td>
<td width="8%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Print extra
information (encoding time in particular).</p></td>
</table>
<p style="margin-left:11%;"><b>&minus;print_psnr</b></p>
<p style="margin-left:22%;">Compute and report average PSNR
(Peak&minus;Signal&minus;To&minus;Noise ratio).</p>
<p style="margin-left:11%;"><b>&minus;print_ssim</b></p>
<p style="margin-left:22%;">Compute and report average SSIM
(structural similarity metric, see
https://en.wikipedia.org/wiki/SSIM for additional
details).</p>
<p style="margin-left:11%;"><b>&minus;print_lsim</b></p>
<p style="margin-left:22%;">Compute and report local
similarity metric (sum of lowest error amongst the
collocated pixel neighbors).</p>
<p style="margin-left:11%;"><b>&minus;progress</b></p>
<p style="margin-left:22%;">Report encoding progress in
percent.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;quiet</b></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Do not print
anything.</p> </td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;short</b></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Only print brief
information (output file size and PSNR) for testing
purposes.</p> </td>
</table>
<p style="margin-left:11%;"><b>&minus;map</b>
<i>int</i></p>
<p style="margin-left:22%;">Output additional
ASCII&minus;map of encoding information. Possible map values
range from 1 to 6. This is only meant to help debugging.</p>
<p style="margin-left:11%; margin-top: 1em"><b>ADDITIONAL
OPTIONS</b> <br>
More advanced options are: <b><br>
&minus;s</b> <i>width height</i></p>
<p style="margin-left:22%;">Specify that the input file
actually consists of raw Y&rsquo;CbCr samples following the
ITU&minus;R BT.601 recommendation, in 4:2:0 linear format.
The luma plane has size <b>width</b> x <b>height</b>.</p>
<p style="margin-left:11%;"><b>&minus;pre</b>
<i>int</i></p>
<p style="margin-left:22%;">Specify some preprocessing
steps. Using a value of &rsquo;2&rsquo; will trigger
quality&minus;dependent pseudo&minus;random dithering during
RGBA&minus;&gt;YUVA conversion (lossy compression only).</p>
<p style="margin-left:11%;"><b>&minus;alpha_filter</b>
<i>string</i></p>
<p style="margin-left:22%;">Specify the predictive
filtering method for the alpha plane. One of
&rsquo;none&rsquo;, &rsquo;fast&rsquo; or
&rsquo;best&rsquo;, in increasing complexity and slowness
order. Default is &rsquo;fast&rsquo;. Internally, alpha
filtering is performed using four possible predictions
(none, horizontal, vertical, gradient). The
&rsquo;best&rsquo; mode will try each mode in turn and pick
the one which gives the smaller size. The &rsquo;fast&rsquo;
mode will just try to form an a priori guess without testing
all modes.</p>
<p style="margin-left:11%;"><b>&minus;alpha_method</b>
<i>int</i></p>
<p style="margin-left:22%;">Specify the algorithm used for
alpha compression: 0 or 1. Algorithm 0 denotes no
compression, 1 uses WebP lossless format for compression.
The default is 1.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;exact</b></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Preserve RGB values
in transparent area. The default is off, to help
compressibility.</p> </td>
</table>
<p style="margin-left:11%;"><b>&minus;blend_alpha</b>
<i>int</i></p>
<p style="margin-left:22%;">This option blends the alpha
channel (if present) with the source using the background
color specified in hexadecimal as 0xrrggbb. The alpha
channel is afterward reset to the opaque value 255.</p>
<p style="margin-left:11%;"><b>&minus;noalpha</b></p>
<p style="margin-left:22%;">Using this option will discard
the alpha channel.</p>
<p style="margin-left:11%;"><b>&minus;hint</b>
<i>string</i></p>
<p style="margin-left:22%;">Specify the hint about input
image type. Possible values are: <b>photo</b>,
<b>picture</b> or <b>graph</b>.</p>
<p style="margin-left:11%;"><b>&minus;metadata</b>
<i>string</i></p>
<p style="margin-left:22%;">A comma separated list of
metadata to copy from the input to the output if present.
Valid values: <b>all</b>, <b>none</b>, <b>exif</b>,
<b>icc</b>, <b>xmp</b>. The default is <b>none</b>.</p>
<p style="margin-left:22%; margin-top: 1em">Note: each
input format may not support all combinations.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;noasm</b></p> </td>
<td width="2%"></td>
<td width="53%">
<p style="margin-top: 1em" valign="top">Disable all
assembly optimizations.</p></td>
<td width="25%">
</td>
</table>
<a name="BUGS"></a>
<h2>BUGS</h2>
<p style="margin-left:11%; margin-top: 1em">Please report
all bugs to the issue tracker:
https://bugs.chromium.org/p/webp <br>
Patches welcome! See this page to get started:
https://www.webmproject.org/code/contribute/submitting&minus;patches/</p>
<a name="EXAMPLES"></a>
<h2>EXAMPLES</h2>
<p style="margin-left:11%; margin-top: 1em">cwebp &minus;q
50 -lossless picture.png &minus;o picture_lossless.webp <br>
cwebp &minus;q 70 picture_with_alpha.png &minus;o
picture_with_alpha.webp <br>
cwebp &minus;sns 70 &minus;f 50 &minus;size 60000
picture.png &minus;o picture.webp <br>
cwebp &minus;o picture.webp &minus;&minus;
&minus;&minus;&minus;picture.png</p>
<a name="AUTHORS"></a>
<h2>AUTHORS</h2>
<p style="margin-left:11%; margin-top: 1em"><b>cwebp</b> is
a part of libwebp and was written by the WebP team. <br>
The latest source tree is available at
https://chromium.googlesource.com/webm/libwebp</p>
<p style="margin-left:11%; margin-top: 1em">This manual
page was written by Pascal Massimino
&lt;pascal.massimino@gmail.com&gt;, for the Debian project
(and may be used by others).</p>
<a name="SEE ALSO"></a>
<h2>SEE ALSO</h2>
<p style="margin-left:11%; margin-top: 1em"><b>dwebp</b>(1),
<b>gif2webp</b>(1) <br>
Please refer to https://developers.google.com/speed/webp/
for additional information.</p>
<hr>
</body>
</html>
@@ -0,0 +1,340 @@
CWEBP(1) CWEBP(1)
NAME
cwebp - compress an image file to a WebP file
SYNOPSIS
cwebp [options] input_file -o output_file.webp
DESCRIPTION
This manual page documents the cwebp command.
cwebp compresses an image using the WebP format. Input format can be
either PNG, JPEG, TIFF, WebP or raw Y'CbCr samples. Note: Animated PNG
and WebP files are not supported.
OPTIONS
The basic options are:
-o string
Specify the name of the output WebP file. If omitted, cwebp will
perform compression but only report statistics. Using "-" as
output name will direct output to 'stdout'.
-- string
Explicitly specify the input file. This option is useful if the
input file starts with a '-' for instance. This option must
appear last. Any other options afterward will be ignored.
-h, -help
A short usage summary.
-H, -longhelp
A summary of all the possible options.
-version
Print the version number (as major.minor.revision) and exit.
-lossless
Encode the image without any loss. For images with fully trans-
parent area, the invisible pixel values (R/G/B or Y/U/V) will be
preserved only if the -exact option is used.
-near_lossless int
Specify the level of near-lossless image preprocessing. This
option adjusts pixel values to help compressibility, but has
minimal impact on the visual quality. It triggers lossless com-
pression mode automatically. The range is 0 (maximum preprocess-
ing) to 100 (no preprocessing, the default). The typical value
is around 60. Note that lossy with -q 100 can at times yield
better results.
-q float
Specify the compression factor for RGB channels between 0 and
100. The default is 75.
In case of lossy compression (default), a small factor produces
a smaller file with lower quality. Best quality is achieved by
using a value of 100.
In case of lossless compression (specified by the -lossless
option), a small factor enables faster compression speed, but
produces a larger file. Maximum compression is achieved by
using a value of 100.
-z int Switch on lossless compression mode with the specified level
between 0 and 9, with level 0 being the fastest, 9 being the
slowest. Fast mode produces larger file size than slower ones. A
good default is -z 6. This option is actually a shortcut for
some predefined settings for quality and method. If options -q
or -m are subsequently used, they will invalidate the effect of
this option.
-alpha_q int
Specify the compression factor for alpha compression between 0
and 100. Lossless compression of alpha is achieved using a
value of 100, while the lower values result in a lossy compres-
sion. The default is 100.
-preset string
Specify a set of pre-defined parameters to suit a particular
type of source material. Possible values are: default, photo,
picture, drawing, icon, text. Since -preset overwrites the other
parameters' values (except the -q one), this option should
preferably appear first in the order of the arguments.
-m int Specify the compression method to use. This parameter controls
the trade off between encoding speed and the compressed file
size and quality. Possible values range from 0 to 6. Default
value is 4. When higher values are used, the encoder will spend
more time inspecting additional encoding possibilities and
decide on the quality gain. Lower value can result in faster
processing time at the expense of larger file size and lower
compression quality.
-crop x_position y_position width height
Crop the source to a rectangle with top-left corner at coordi-
nates (x_position, y_position) and size width x height. This
cropping area must be fully contained within the source rectan-
gle. Note: the cropping is applied before any scaling.
-resize width height
Resize the source to a rectangle with size width x height. If
either (but not both) of the width or height parameters is 0,
the value will be calculated preserving the aspect-ratio. Note:
scaling is applied after cropping.
-mt Use multi-threading for encoding, if possible.
-low_memory
Reduce memory usage of lossy encoding by saving four times the
compressed size (typically). This will make the encoding slower
and the output slightly different in size and distortion. This
flag is only effective for methods 3 and up, and is off by
default. Note that leaving this flag off will have some side
effects on the bitstream: it forces certain bitstream features
like number of partitions (forced to 1). Note that a more
detailed report of bitstream size is printed by cwebp when using
this option.
LOSSY OPTIONS
These options are only effective when doing lossy encoding (the
default, with or without alpha).
-size int
Specify a target size (in bytes) to try and reach for the com-
pressed output. The compressor will make several passes of par-
tial encoding in order to get as close as possible to this tar-
get. If both -size and -psnr are used, -size value will prevail.
-psnr float
Specify a target PSNR (in dB) to try and reach for the com-
pressed output. The compressor will make several passes of par-
tial encoding in order to get as close as possible to this tar-
get. If both -size and -psnr are used, -size value will prevail.
-pass int
Set a maximum number of passes to use during the dichotomy used
by options -size or -psnr. Maximum value is 10, default is 1.
If options -size or -psnr were used, but -pass wasn't specified,
a default value of '6' passes will be used.
-qrange int int
Specifies the permissible interval for the quality factor. This
is particularly useful when using multi-pass (-size or -psnr
options). Default is 0 100. If the quality factor is outside
this range, it will be clamped. If the minimum value must be
less or equal to the maximum one.
-af Turns auto-filter on. This algorithm will spend additional time
optimizing the filtering strength to reach a well-balanced qual-
ity.
-jpeg_like
Change the internal parameter mapping to better match the
expected size of JPEG compression. This flag will generally pro-
duce an output file of similar size to its JPEG equivalent (for
the same -q setting), but with less visual distortion.
Advanced options:
-f int Specify the strength of the deblocking filter, between 0 (no
filtering) and 100 (maximum filtering). A value of 0 will turn
off any filtering. Higher value will increase the strength of
the filtering process applied after decoding the picture. The
higher the value the smoother the picture will appear. Typical
values are usually in the range of 20 to 50.
-sharpness int
Specify the sharpness of the filtering (if used). Range is 0
(sharpest) to 7 (least sharp). Default is 0.
-strong
Use strong filtering (if filtering is being used thanks to the
-f option). Strong filtering is on by default.
-nostrong
Disable strong filtering (if filtering is being used thanks to
the -f option) and use simple filtering instead.
-sharp_yuv
Use more accurate and sharper RGB->YUV conversion if needed.
Note that this process is slower than the default 'fast'
RGB->YUV conversion.
-sns int
Specify the amplitude of the spatial noise shaping. Spatial
noise shaping (or sns for short) refers to a general collection
of built-in algorithms used to decide which area of the picture
should use relatively less bits, and where else to better trans-
fer these bits. The possible range goes from 0 (algorithm is
off) to 100 (the maximal effect). The default value is 50.
-segments int
Change the number of partitions to use during the segmentation
of the sns algorithm. Segments should be in range 1 to 4.
Default value is 4. This option has no effect for methods 3 and
up, unless -low_memory is used.
-partition_limit int
Degrade quality by limiting the number of bits used by some mac-
roblocks. Range is 0 (no degradation, the default) to 100 (full
degradation). Useful values are usually around 30-70 for moder-
ately large images. In the VP8 format, the so-called control
partition has a limit of 512k and is used to store the following
information: whether the macroblock is skipped, which segment it
belongs to, whether it is coded as intra 4x4 or intra 16x16
mode, and finally the prediction modes to use for each of the
sub-blocks. For a very large image, 512k only leaves room to
few bits per 16x16 macroblock. The absolute minimum is 4 bits
per macroblock. Skip, segment, and mode information can use up
almost all these 4 bits (although the case is unlikely), which
is problematic for very large images. The partition_limit factor
controls how frequently the most bit-costly mode (intra 4x4)
will be used. This is useful in case the 512k limit is reached
and the following message is displayed: Error code: 6 (PARTI-
TION0_OVERFLOW: Partition #0 is too big to fit 512k). If using
-partition_limit is not enough to meet the 512k constraint, one
should use less segments in order to save more header bits per
macroblock. See the -segments option.
LOGGING OPTIONS
These options control the level of output:
-v Print extra information (encoding time in particular).
-print_psnr
Compute and report average PSNR (Peak-Signal-To-Noise ratio).
-print_ssim
Compute and report average SSIM (structural similarity metric,
see https://en.wikipedia.org/wiki/SSIM for additional details).
-print_lsim
Compute and report local similarity metric (sum of lowest error
amongst the collocated pixel neighbors).
-progress
Report encoding progress in percent.
-quiet Do not print anything.
-short Only print brief information (output file size and PSNR) for
testing purposes.
-map int
Output additional ASCII-map of encoding information. Possible
map values range from 1 to 6. This is only meant to help debug-
ging.
ADDITIONAL OPTIONS
More advanced options are:
-s width height
Specify that the input file actually consists of raw Y'CbCr sam-
ples following the ITU-R BT.601 recommendation, in 4:2:0 linear
format. The luma plane has size width x height.
-pre int
Specify some preprocessing steps. Using a value of '2' will
trigger quality-dependent pseudo-random dithering during
RGBA->YUVA conversion (lossy compression only).
-alpha_filter string
Specify the predictive filtering method for the alpha plane. One
of 'none', 'fast' or 'best', in increasing complexity and slow-
ness order. Default is 'fast'. Internally, alpha filtering is
performed using four possible predictions (none, horizontal,
vertical, gradient). The 'best' mode will try each mode in turn
and pick the one which gives the smaller size. The 'fast' mode
will just try to form an a priori guess without testing all
modes.
-alpha_method int
Specify the algorithm used for alpha compression: 0 or 1. Algo-
rithm 0 denotes no compression, 1 uses WebP lossless format for
compression. The default is 1.
-exact Preserve RGB values in transparent area. The default is off, to
help compressibility.
-blend_alpha int
This option blends the alpha channel (if present) with the
source using the background color specified in hexadecimal as
0xrrggbb. The alpha channel is afterward reset to the opaque
value 255.
-noalpha
Using this option will discard the alpha channel.
-hint string
Specify the hint about input image type. Possible values are:
photo, picture or graph.
-metadata string
A comma separated list of metadata to copy from the input to the
output if present. Valid values: all, none, exif, icc, xmp.
The default is none.
Note: each input format may not support all combinations.
-noasm Disable all assembly optimizations.
BUGS
Please report all bugs to the issue tracker:
https://bugs.chromium.org/p/webp
Patches welcome! See this page to get started: https://www.webmpro-
ject.org/code/contribute/submitting-patches/
EXAMPLES
cwebp -q 50 -lossless picture.png -o picture_lossless.webp
cwebp -q 70 picture_with_alpha.png -o picture_with_alpha.webp
cwebp -sns 70 -f 50 -size 60000 picture.png -o picture.webp
cwebp -o picture.webp -- ---picture.png
AUTHORS
cwebp is a part of libwebp and was written by the WebP team.
The latest source tree is available at https://chromium.google-
source.com/webm/libwebp
This manual page was written by Pascal Massimino <pascal.mas-
simino@gmail.com>, for the Debian project (and may be used by others).
SEE ALSO
dwebp(1), gif2webp(1)
Please refer to https://developers.google.com/speed/webp/ for addi-
tional information.
March 17, 2022 CWEBP(1)
@@ -0,0 +1,386 @@
<!-- Creator : groff version 1.19.2 -->
<!-- CreationDate: Fri Aug 5 18:48:54 2022 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="generator" content="groff -Thtml, see www.gnu.org">
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<meta name="Content-Style" content="text/css">
<style type="text/css">
p { margin-top: 0; margin-bottom: 0; }
pre { margin-top: 0; margin-bottom: 0; }
table { margin-top: 0; margin-bottom: 0; }
</style>
<title>DWEBP</title>
</head>
<body>
<h1 align=center>DWEBP</h1>
<a href="#NAME">NAME</a><br>
<a href="#SYNOPSIS">SYNOPSIS</a><br>
<a href="#DESCRIPTION">DESCRIPTION</a><br>
<a href="#OPTIONS">OPTIONS</a><br>
<a href="#BUGS">BUGS</a><br>
<a href="#EXAMPLES">EXAMPLES</a><br>
<a href="#AUTHORS">AUTHORS</a><br>
<a href="#SEE ALSO">SEE ALSO</a><br>
<hr>
<a name="NAME"></a>
<h2>NAME</h2>
<p style="margin-left:11%; margin-top: 1em">dwebp &minus;
decompress a WebP file to an image file</p>
<a name="SYNOPSIS"></a>
<h2>SYNOPSIS</h2>
<p style="margin-left:11%; margin-top: 1em"><b>dwebp</b>
[<i>options</i>] <i>input_file.webp</i></p>
<a name="DESCRIPTION"></a>
<h2>DESCRIPTION</h2>
<p style="margin-left:11%; margin-top: 1em">This manual
page documents the <b>dwebp</b> command.</p>
<p style="margin-left:11%; margin-top: 1em"><b>dwebp</b>
decompresses WebP files into PNG, PAM, PPM or PGM images.
Note: Animated WebP files are not supported.</p>
<a name="OPTIONS"></a>
<h2>OPTIONS</h2>
<p style="margin-left:11%; margin-top: 1em">The basic
options are:</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="3%">
<p style="margin-top: 1em" valign="top"><b>&minus;h</b></p> </td>
<td width="8%"></td>
<td width="30%">
<p style="margin-top: 1em" valign="top">Print usage
summary.</p> </td>
<td width="48%">
</td>
</table>
<p style="margin-left:11%;"><b>&minus;version</b></p>
<p style="margin-left:22%;">Print the version number (as
major.minor.revision) and exit.</p>
<p style="margin-left:11%;"><b>&minus;o</b>
<i>string</i></p>
<p style="margin-left:22%;">Specify the name of the output
file (as PNG format by default). Using &quot;-&quot; as
output name will direct output to &rsquo;stdout&rsquo;.</p>
<p style="margin-left:11%;"><b>&minus;&minus;</b>
<i>string</i></p>
<p style="margin-left:22%;">Explicitly specify the input
file. This option is useful if the input file starts with an
&rsquo;&minus;&rsquo; for instance. This option must appear
<b>last</b>. Any other options afterward will be ignored. If
the input file is &quot;&minus;&quot;, the data will be read
from <i>stdin</i> instead of a file.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="7%">
<p style="margin-top: 1em" valign="top"><b>&minus;bmp</b></p> </td>
<td width="4%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Change the output
format to uncompressed BMP.</p></td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="7%">
<p style="margin-top: 1em" valign="top"><b>&minus;tiff</b></p> </td>
<td width="4%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Change the output
format to uncompressed TIFF.</p></td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="7%">
<p style="margin-top: 1em" valign="top"><b>&minus;pam</b></p> </td>
<td width="4%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Change the output
format to PAM (retains alpha).</p></td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="7%">
<p style="margin-top: 1em" valign="top"><b>&minus;ppm</b></p> </td>
<td width="4%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Change the output
format to PPM (discards alpha).</p></td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="7%">
<p style="margin-top: 1em" valign="top"><b>&minus;pgm</b></p> </td>
<td width="4%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Change the output
format to PGM. The output consists of luma/chroma samples
instead of RGB, using the IMC4 layout. This option is mainly
for verification and debugging purposes.</p></td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="7%">
<p style="margin-top: 1em" valign="top"><b>&minus;yuv</b></p> </td>
<td width="4%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Change the output
format to raw YUV. The output consists of
luma/chroma-U/chroma-V samples instead of RGB, saved
sequentially as individual planes. This option is mainly for
verification and debugging purposes.</p></td>
</table>
<p style="margin-left:11%;"><b>&minus;nofancy</b></p>
<p style="margin-left:22%;">Don&rsquo;t use the fancy
upscaler for YUV420. This may lead to jaggy edges
(especially the red ones), but should be faster.</p>
<p style="margin-left:11%;"><b>&minus;nofilter</b></p>
<p style="margin-left:22%;">Don&rsquo;t use the in-loop
filtering process even if it is required by the bitstream.
This may produce visible blocks on the non-compliant output,
but it will make the decoding faster.</p>
<p style="margin-left:11%;"><b>&minus;dither</b>
<i>strength</i></p>
<p style="margin-left:22%;">Specify a dithering
<b>strength</b> between 0 and 100. Dithering is a
post-processing effect applied to chroma components in lossy
compression. It helps by smoothing gradients and avoiding
banding artifacts.</p>
<p style="margin-left:11%;"><b>&minus;alpha_dither</b></p>
<p style="margin-left:22%;">If the compressed file contains
a transparency plane that was quantized during compression,
this flag will allow dithering the reconstructed plane in
order to generate smoother transparency gradients.</p>
<p style="margin-left:11%;"><b>&minus;nodither</b></p>
<p style="margin-left:22%;">Disable all dithering
(default).</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="4%">
<p style="margin-top: 1em" valign="top"><b>&minus;mt</b></p> </td>
<td width="7%"></td>
<td width="70%">
<p style="margin-top: 1em" valign="top">Use multi-threading
for decoding, if possible.</p></td>
<td width="8%">
</td>
</table>
<p style="margin-left:11%;"><b>&minus;crop</b>
<i>x_position y_position width height</i></p>
<p style="margin-left:22%;">Crop the decoded picture to a
rectangle with top-left corner at coordinates
(<b>x_position</b>, <b>y_position</b>) and size <b>width</b>
x <b>height</b>. This cropping area must be fully contained
within the source rectangle. The top-left corner will be
snapped to even coordinates if needed. This option is meant
to reduce the memory needed for cropping large images. Note:
the cropping is applied <i>before</i> any scaling.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="7%">
<p style="margin-top: 1em" valign="top"><b>&minus;flip</b></p> </td>
<td width="4%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Flip decoded image
vertically (can be useful for OpenGL textures for
instance).</p> </td>
</table>
<p style="margin-left:11%;"><b>&minus;resize</b>,
<b>&minus;scale</b> <i>width height</i></p>
<p style="margin-left:22%;">Rescale the decoded picture to
dimension <b>width</b> x <b>height</b>. This option is
mostly intended to reducing the memory needed to decode
large images, when only a small version is needed
(thumbnail, preview, etc.). Note: scaling is applied
<i>after</i> cropping. If either (but not both) of the
<b>width</b> or <b>height</b> parameters is 0, the value
will be calculated preserving the aspect-ratio.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;quiet</b></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Do not print
anything.</p> </td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;v</b></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Print extra
information (decoding time in particular).</p></td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;noasm</b></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Disable all
assembly optimizations.</p></td>
</table>
<a name="BUGS"></a>
<h2>BUGS</h2>
<p style="margin-left:11%; margin-top: 1em">Please report
all bugs to the issue tracker:
https://bugs.chromium.org/p/webp <br>
Patches welcome! See this page to get started:
https://www.webmproject.org/code/contribute/submitting&minus;patches/</p>
<a name="EXAMPLES"></a>
<h2>EXAMPLES</h2>
<p style="margin-left:11%; margin-top: 1em">dwebp
picture.webp &minus;o output.png <br>
dwebp picture.webp &minus;ppm &minus;o output.ppm <br>
dwebp &minus;o output.ppm &minus;&minus;
&minus;&minus;&minus;picture.webp <br>
cat picture.webp | dwebp &minus;o &minus; &minus;&minus;
&minus; &gt; output.ppm</p>
<a name="AUTHORS"></a>
<h2>AUTHORS</h2>
<p style="margin-left:11%; margin-top: 1em"><b>dwebp</b> is
a part of libwebp and was written by the WebP team. <br>
The latest source tree is available at
https://chromium.googlesource.com/webm/libwebp</p>
<p style="margin-left:11%; margin-top: 1em">This manual
page was written by Pascal Massimino
&lt;pascal.massimino@gmail.com&gt;, for the Debian project
(and may be used by others).</p>
<a name="SEE ALSO"></a>
<h2>SEE ALSO</h2>
<p style="margin-left:11%; margin-top: 1em"><b>cwebp</b>(1),
<b>gif2webp</b>(1), <b>webpmux</b>(1) <br>
Please refer to https://developers.google.com/speed/webp/
for additional information.</p>
<p style="margin-left:11%; margin-top: 1em"><b>Output file
format details</b> <br>
PAM: http://netpbm.sourceforge.net/doc/pam.html <br>
PGM: http://netpbm.sourceforge.net/doc/pgm.html <br>
PPM: http://netpbm.sourceforge.net/doc/ppm.html <br>
PNG: http://www.libpng.org/pub/png/png-sitemap.html#info</p>
<hr>
</body>
</html>
@@ -0,0 +1,142 @@
DWEBP(1) DWEBP(1)
NAME
dwebp - decompress a WebP file to an image file
SYNOPSIS
dwebp [options] input_file.webp
DESCRIPTION
This manual page documents the dwebp command.
dwebp decompresses WebP files into PNG, PAM, PPM or PGM images. Note:
Animated WebP files are not supported.
OPTIONS
The basic options are:
-h Print usage summary.
-version
Print the version number (as major.minor.revision) and exit.
-o string
Specify the name of the output file (as PNG format by default).
Using "-" as output name will direct output to 'stdout'.
-- string
Explicitly specify the input file. This option is useful if the
input file starts with an '-' for instance. This option must
appear last. Any other options afterward will be ignored. If
the input file is "-", the data will be read from stdin instead
of a file.
-bmp Change the output format to uncompressed BMP.
-tiff Change the output format to uncompressed TIFF.
-pam Change the output format to PAM (retains alpha).
-ppm Change the output format to PPM (discards alpha).
-pgm Change the output format to PGM. The output consists of
luma/chroma samples instead of RGB, using the IMC4 layout. This
option is mainly for verification and debugging purposes.
-yuv Change the output format to raw YUV. The output consists of
luma/chroma-U/chroma-V samples instead of RGB, saved sequen-
tially as individual planes. This option is mainly for verifica-
tion and debugging purposes.
-nofancy
Don't use the fancy upscaler for YUV420. This may lead to jaggy
edges (especially the red ones), but should be faster.
-nofilter
Don't use the in-loop filtering process even if it is required
by the bitstream. This may produce visible blocks on the non-
compliant output, but it will make the decoding faster.
-dither strength
Specify a dithering strength between 0 and 100. Dithering is a
post-processing effect applied to chroma components in lossy
compression. It helps by smoothing gradients and avoiding band-
ing artifacts.
-alpha_dither
If the compressed file contains a transparency plane that was
quantized during compression, this flag will allow dithering the
reconstructed plane in order to generate smoother transparency
gradients.
-nodither
Disable all dithering (default).
-mt Use multi-threading for decoding, if possible.
-crop x_position y_position width height
Crop the decoded picture to a rectangle with top-left corner at
coordinates (x_position, y_position) and size width x height.
This cropping area must be fully contained within the source
rectangle. The top-left corner will be snapped to even coordi-
nates if needed. This option is meant to reduce the memory
needed for cropping large images. Note: the cropping is applied
before any scaling.
-flip Flip decoded image vertically (can be useful for OpenGL textures
for instance).
-resize, -scale width height
Rescale the decoded picture to dimension width x height. This
option is mostly intended to reducing the memory needed to
decode large images, when only a small version is needed (thumb-
nail, preview, etc.). Note: scaling is applied after cropping.
If either (but not both) of the width or height parameters is 0,
the value will be calculated preserving the aspect-ratio.
-quiet Do not print anything.
-v Print extra information (decoding time in particular).
-noasm Disable all assembly optimizations.
BUGS
Please report all bugs to the issue tracker:
https://bugs.chromium.org/p/webp
Patches welcome! See this page to get started: https://www.webmpro-
ject.org/code/contribute/submitting-patches/
EXAMPLES
dwebp picture.webp -o output.png
dwebp picture.webp -ppm -o output.ppm
dwebp -o output.ppm -- ---picture.webp
cat picture.webp | dwebp -o - -- - > output.ppm
AUTHORS
dwebp is a part of libwebp and was written by the WebP team.
The latest source tree is available at https://chromium.google-
source.com/webm/libwebp
This manual page was written by Pascal Massimino <pascal.mas-
simino@gmail.com>, for the Debian project (and may be used by others).
SEE ALSO
cwebp(1), gif2webp(1), webpmux(1)
Please refer to https://developers.google.com/speed/webp/ for addi-
tional information.
Output file format details
PAM: http://netpbm.sourceforge.net/doc/pam.html
PGM: http://netpbm.sourceforge.net/doc/pgm.html
PPM: http://netpbm.sourceforge.net/doc/ppm.html
PNG: http://www.libpng.org/pub/png/png-sitemap.html#info
November 17, 2021 DWEBP(1)
@@ -0,0 +1,341 @@
<!-- Creator : groff version 1.19.2 -->
<!-- CreationDate: Fri Aug 5 18:48:54 2022 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="generator" content="groff -Thtml, see www.gnu.org">
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<meta name="Content-Style" content="text/css">
<style type="text/css">
p { margin-top: 0; margin-bottom: 0; }
pre { margin-top: 0; margin-bottom: 0; }
table { margin-top: 0; margin-bottom: 0; }
</style>
<title>GIF2WEBP</title>
</head>
<body>
<h1 align=center>GIF2WEBP</h1>
<a href="#NAME">NAME</a><br>
<a href="#SYNOPSIS">SYNOPSIS</a><br>
<a href="#DESCRIPTION">DESCRIPTION</a><br>
<a href="#OPTIONS">OPTIONS</a><br>
<a href="#BUGS">BUGS</a><br>
<a href="#EXAMPLES">EXAMPLES</a><br>
<a href="#AUTHORS">AUTHORS</a><br>
<a href="#SEE ALSO">SEE ALSO</a><br>
<hr>
<a name="NAME"></a>
<h2>NAME</h2>
<p style="margin-left:11%; margin-top: 1em">gif2webp
&minus; Convert a GIF image to WebP</p>
<a name="SYNOPSIS"></a>
<h2>SYNOPSIS</h2>
<p style="margin-left:11%; margin-top: 1em"><b>gif2webp</b>
[<i>options</i>] <i>input_file.gif &minus;o
output_file.webp</i></p>
<a name="DESCRIPTION"></a>
<h2>DESCRIPTION</h2>
<p style="margin-left:11%; margin-top: 1em">This manual
page documents the <b>gif2webp</b> command.</p>
<p style="margin-left:11%; margin-top: 1em"><b>gif2webp</b>
converts a GIF image to a WebP image.</p>
<a name="OPTIONS"></a>
<h2>OPTIONS</h2>
<p style="margin-left:11%; margin-top: 1em">The basic
options are: <b><br>
&minus;o</b> <i>string</i></p>
<p style="margin-left:22%;">Specify the name of the output
WebP file. If omitted, <b>gif2webp</b> will perform
conversion but only report statistics. Using
&quot;&minus;&quot; as output name will direct output to
&rsquo;stdout&rsquo;.</p>
<p style="margin-left:11%;"><b>&minus;&minus;</b>
<i>string</i></p>
<p style="margin-left:22%;">Explicitly specify the input
file. This option is useful if the input file starts with an
&rsquo;&minus;&rsquo; for instance. This option must appear
<b>last</b>. Any other options afterward will be ignored. If
the input file is &quot;&minus;&quot;, the data will be read
from <i>stdin</i> instead of a file.</p>
<p style="margin-left:11%;"><b>&minus;h,
&minus;help</b></p>
<p style="margin-left:22%;">Usage information.</p>
<p style="margin-left:11%;"><b>&minus;version</b></p>
<p style="margin-left:22%;">Print the version number (as
major.minor.revision) and exit.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;lossy</b></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Encode the image
using lossy compression.</p></td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;mixed</b></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Mixed compression
mode: optimize compression of the image by picking either
lossy or lossless compression for each frame
heuristically.</p> </td>
</table>
<p style="margin-left:11%;"><b>&minus;q</b>
<i>float</i></p>
<p style="margin-left:22%;">Specify the compression factor
for RGB channels between 0 and 100. The default is 75. <br>
In case of lossless compression (default), a small factor
enables faster compression speed, but produces a larger
file. Maximum compression is achieved by using a value of
100. <br>
In case of lossy compression (specified by the &minus;lossy
option), a small factor produces a smaller file with lower
quality. Best quality is achieved by using a value of
100.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;m</b>
<i>int</i></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Specify the
compression method to use. This parameter controls the trade
off between encoding speed and the compressed file size and
quality. Possible values range from 0 to 6. Default value is
4. When higher values are used, the encoder will spend more
time inspecting additional encoding possibilities and decide
on the quality gain. Lower value can result is faster
processing time at the expense of larger file size and lower
compression quality.</p></td>
</table>
<p style="margin-left:11%;"><b>&minus;min_size</b></p>
<p style="margin-left:22%;">Encode image to achieve
smallest size. This disables key frame insertion and picks
the dispose method resulting in the smallest output for each
frame. It uses lossless compression by default, but can be
combined with &minus;q, &minus;m, &minus;lossy or
&minus;mixed options.</p>
<p style="margin-left:11%;"><b>&minus;kmin</b> <i>int</i>
<b><br>
&minus;kmax</b> <i>int</i></p>
<p style="margin-left:22%;">Specify the minimum and maximum
distance between consecutive key frames (independently
decodable frames) in the output animation. The tool will
insert some key frames into the output animation as needed
so that this criteria is satisfied. <br>
A &rsquo;kmax&rsquo; value of 0 will turn off insertion of
key frames. A &rsquo;kmax&rsquo; value of 1 will result in
all frames being key frames. &rsquo;kmin&rsquo; value is not
taken into account in both these special cases. Typical
values are in the range 3 to 30. Default values are kmin =
9, kmax = 17 for lossless compression and kmin = 3, kmax = 5
for lossy compression. <br>
These two options are relevant only for animated images with
large number of frames (&gt;50). <br>
When lower values are used, more frames will be converted to
key frames. This may lead to smaller number of frames
required to decode a frame on average, thereby improving the
decoding performance. But this may lead to slightly bigger
file sizes. Higher values may lead to worse decoding
performance, but smaller file sizes. <br>
Some restrictions: <br>
(i) kmin &lt; kmax, <br>
(ii) kmin &gt;= kmax / 2 + 1 and <br>
(iii) kmax - kmin &lt;= 30. <br>
If any of these restrictions are not met, they will be
enforced automatically.</p>
<p style="margin-left:11%;"><b>&minus;metadata</b>
<i>string</i></p>
<p style="margin-left:22%;">A comma separated list of
metadata to copy from the input to the output if present.
Valid values: <b>all</b>, <b>none</b>, <b>icc</b>,
<b>xmp</b>. The default is <b>xmp</b>.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;f</b>
<i>int</i></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">For lossy encoding
only (specified by the &minus;lossy option). Specify the
strength of the deblocking filter, between 0 (no filtering)
and 100 (maximum filtering). A value of 0 will turn off any
filtering. Higher value will increase the strength of the
filtering process applied after decoding the picture. The
higher the value the smoother the picture will appear.
Typical values are usually in the range of 20 to 50.</p></td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;mt</b></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Use multi-threading
for encoding, if possible.</p></td>
</table>
<p style="margin-left:11%;"><b>&minus;loop_compatibility</b></p>
<p style="margin-left:22%;">If enabled, handle the loop
information in a compatible fashion for Chrome version prior
to M62 (inclusive) and Firefox.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;v</b></p> </td>
<td width="2%"></td>
<td width="36%">
<p style="margin-top: 1em" valign="top">Print extra
information.</p> </td>
<td width="42%">
</td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;quiet</b></p> </td>
<td width="2%"></td>
<td width="36%">
<p style="margin-top: 1em" valign="top">Do not print
anything.</p> </td>
<td width="42%">
</td>
</table>
<a name="BUGS"></a>
<h2>BUGS</h2>
<p style="margin-left:11%; margin-top: 1em">Please report
all bugs to the issue tracker:
https://bugs.chromium.org/p/webp <br>
Patches welcome! See this page to get started:
https://www.webmproject.org/code/contribute/submitting&minus;patches/</p>
<a name="EXAMPLES"></a>
<h2>EXAMPLES</h2>
<p style="margin-left:11%; margin-top: 1em">gif2webp
picture.gif &minus;o picture.webp <br>
gif2webp &minus;q 70 picture.gif &minus;o picture.webp <br>
gif2webp &minus;lossy &minus;m 3 picture.gif &minus;o
picture_lossy.webp <br>
gif2webp &minus;lossy &minus;f 50 picture.gif &minus;o
picture.webp <br>
gif2webp &minus;q 70 &minus;o picture.webp &minus;&minus;
&minus;&minus;&minus;picture.gif <br>
cat picture.gif | gif2webp &minus;o &minus; &minus;&minus;
&minus; &gt; output.webp</p>
<a name="AUTHORS"></a>
<h2>AUTHORS</h2>
<p style="margin-left:11%; margin-top: 1em"><b>gif2webp</b>
is a part of libwebp and was written by the WebP team. <br>
The latest source tree is available at
https://chromium.googlesource.com/webm/libwebp</p>
<p style="margin-left:11%; margin-top: 1em">This manual
page was written by Urvang Joshi &lt;urvang@google.com&gt;,
for the Debian project (and may be used by others).</p>
<a name="SEE ALSO"></a>
<h2>SEE ALSO</h2>
<p style="margin-left:11%; margin-top: 1em"><b>cwebp</b>(1),
<b>dwebp</b>(1), <b>webpmux</b>(1) <br>
Please refer to https://developers.google.com/speed/webp/
for additional information.</p>
<hr>
</body>
</html>
@@ -0,0 +1,152 @@
GIF2WEBP(1) GIF2WEBP(1)
NAME
gif2webp - Convert a GIF image to WebP
SYNOPSIS
gif2webp [options] input_file.gif -o output_file.webp
DESCRIPTION
This manual page documents the gif2webp command.
gif2webp converts a GIF image to a WebP image.
OPTIONS
The basic options are:
-o string
Specify the name of the output WebP file. If omitted, gif2webp
will perform conversion but only report statistics. Using "-"
as output name will direct output to 'stdout'.
-- string
Explicitly specify the input file. This option is useful if the
input file starts with an '-' for instance. This option must
appear last. Any other options afterward will be ignored. If
the input file is "-", the data will be read from stdin instead
of a file.
-h, -help
Usage information.
-version
Print the version number (as major.minor.revision) and exit.
-lossy Encode the image using lossy compression.
-mixed Mixed compression mode: optimize compression of the image by
picking either lossy or lossless compression for each frame
heuristically.
-q float
Specify the compression factor for RGB channels between 0 and
100. The default is 75.
In case of lossless compression (default), a small factor
enables faster compression speed, but produces a larger file.
Maximum compression is achieved by using a value of 100.
In case of lossy compression (specified by the -lossy option), a
small factor produces a smaller file with lower quality. Best
quality is achieved by using a value of 100.
-m int Specify the compression method to use. This parameter controls
the trade off between encoding speed and the compressed file
size and quality. Possible values range from 0 to 6. Default
value is 4. When higher values are used, the encoder will spend
more time inspecting additional encoding possibilities and
decide on the quality gain. Lower value can result is faster
processing time at the expense of larger file size and lower
compression quality.
-min_size
Encode image to achieve smallest size. This disables key frame
insertion and picks the dispose method resulting in the smallest
output for each frame. It uses lossless compression by default,
but can be combined with -q, -m, -lossy or -mixed options.
-kmin int
-kmax int
Specify the minimum and maximum distance between consecutive key
frames (independently decodable frames) in the output animation.
The tool will insert some key frames into the output animation
as needed so that this criteria is satisfied.
A 'kmax' value of 0 will turn off insertion of key frames. A
'kmax' value of 1 will result in all frames being key frames.
'kmin' value is not taken into account in both these special
cases. Typical values are in the range 3 to 30. Default values
are kmin = 9, kmax = 17 for lossless compression and kmin = 3,
kmax = 5 for lossy compression.
These two options are relevant only for animated images with
large number of frames (>50).
When lower values are used, more frames will be converted to key
frames. This may lead to smaller number of frames required to
decode a frame on average, thereby improving the decoding per-
formance. But this may lead to slightly bigger file sizes.
Higher values may lead to worse decoding performance, but
smaller file sizes.
Some restrictions:
(i) kmin < kmax,
(ii) kmin >= kmax / 2 + 1 and
(iii) kmax - kmin <= 30.
If any of these restrictions are not met, they will be enforced
automatically.
-metadata string
A comma separated list of metadata to copy from the input to the
output if present. Valid values: all, none, icc, xmp. The
default is xmp.
-f int For lossy encoding only (specified by the -lossy option). Spec-
ify the strength of the deblocking filter, between 0 (no filter-
ing) and 100 (maximum filtering). A value of 0 will turn off
any filtering. Higher value will increase the strength of the
filtering process applied after decoding the picture. The higher
the value the smoother the picture will appear. Typical values
are usually in the range of 20 to 50.
-mt Use multi-threading for encoding, if possible.
-loop_compatibility
If enabled, handle the loop information in a compatible fashion
for Chrome version prior to M62 (inclusive) and Firefox.
-v Print extra information.
-quiet Do not print anything.
BUGS
Please report all bugs to the issue tracker:
https://bugs.chromium.org/p/webp
Patches welcome! See this page to get started: https://www.webmpro-
ject.org/code/contribute/submitting-patches/
EXAMPLES
gif2webp picture.gif -o picture.webp
gif2webp -q 70 picture.gif -o picture.webp
gif2webp -lossy -m 3 picture.gif -o picture_lossy.webp
gif2webp -lossy -f 50 picture.gif -o picture.webp
gif2webp -q 70 -o picture.webp -- ---picture.gif
cat picture.gif | gif2webp -o - -- - > output.webp
AUTHORS
gif2webp is a part of libwebp and was written by the WebP team.
The latest source tree is available at https://chromium.google-
source.com/webm/libwebp
This manual page was written by Urvang Joshi <urvang@google.com>, for
the Debian project (and may be used by others).
SEE ALSO
cwebp(1), dwebp(1), webpmux(1)
Please refer to https://developers.google.com/speed/webp/ for addi-
tional information.
November 17, 2021 GIF2WEBP(1)
@@ -0,0 +1,245 @@
<!-- Creator : groff version 1.19.2 -->
<!-- CreationDate: Fri Aug 5 18:48:55 2022 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="generator" content="groff -Thtml, see www.gnu.org">
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<meta name="Content-Style" content="text/css">
<style type="text/css">
p { margin-top: 0; margin-bottom: 0; }
pre { margin-top: 0; margin-bottom: 0; }
table { margin-top: 0; margin-bottom: 0; }
</style>
<title>IMG2WEBP</title>
</head>
<body>
<h1 align=center>IMG2WEBP</h1>
<a href="#NAME">NAME</a><br>
<a href="#SYNOPSIS">SYNOPSIS</a><br>
<a href="#DESCRIPTION">DESCRIPTION</a><br>
<a href="#FILE-LEVEL OPTIONS">FILE-LEVEL OPTIONS</a><br>
<a href="#PER-FRAME OPTIONS">PER-FRAME OPTIONS</a><br>
<a href="#EXAMPLE">EXAMPLE</a><br>
<a href="#BUGS">BUGS</a><br>
<a href="#AUTHORS">AUTHORS</a><br>
<a href="#SEE ALSO">SEE ALSO</a><br>
<hr>
<a name="NAME"></a>
<h2>NAME</h2>
<p style="margin-left:11%; margin-top: 1em">img2webp
&minus; create animated WebP file from a sequence of input
images.</p>
<a name="SYNOPSIS"></a>
<h2>SYNOPSIS</h2>
<p style="margin-left:11%; margin-top: 1em"><b>img2webp</b>
[file_options] [[frame_options] frame_file]... <b><br>
img2webp argument_file_name</b></p>
<a name="DESCRIPTION"></a>
<h2>DESCRIPTION</h2>
<p style="margin-left:11%; margin-top: 1em">This manual
page documents the <b>img2webp</b> command.</p>
<p style="margin-left:11%; margin-top: 1em"><b>img2webp</b>
compresses a sequence of images using the animated WebP
format. Input images can either be PNG, JPEG, TIFF or WebP.
If a single file name (not starting with the character
&rsquo;&minus;&rsquo;) is supplied as the argument, the
command line arguments are actually tokenized from this
file. This allows for easy scripting or using a large number
of arguments.</p>
<a name="FILE-LEVEL OPTIONS"></a>
<h2>FILE-LEVEL OPTIONS</h2>
<p style="margin-left:11%; margin-top: 1em">The file-level
options are applied at the beginning of the compression
process, before the input frames are read. <b><br>
&minus;o</b> <i>string</i></p>
<p style="margin-left:22%;">Specify the name of the output
WebP file.</p>
<p style="margin-left:11%;"><b>&minus;min_size</b></p>
<p style="margin-left:22%;">Encode images to achieve
smallest size. This disables key frame insertion and picks
the parameters resulting in the smallest output for each
frame. It uses lossless compression by default, but can be
combined with &minus;q, &minus;m, &minus;lossy or
&minus;mixed options.</p>
<p style="margin-left:11%;"><b>&minus;kmin</b> <i>int</i>
<b><br>
&minus;kmax</b> <i>int</i></p>
<p style="margin-left:22%;">Specify the minimum and maximum
distance between consecutive key frames (independently
decodable frames) in the output animation. The tool will
insert some key frames into the output animation as needed
so that this criteria is satisfied. <b><br>
&minus;mixed</b> Mixed compression mode: optimize
compression of the image by picking either lossy or lossless
compression for each frame heuristically. This global option
disables the local option <b>-lossy</b> and <b>-lossless</b>
.</p>
<p style="margin-left:11%;"><b>&minus;loop</b>
<i>int</i></p>
<p style="margin-left:22%;">Specifies the number of times
the animation should loop. Using &rsquo;0&rsquo; means
&rsquo;loop indefinitely&rsquo;.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="3%">
<p style="margin-top: 1em" valign="top"><b>&minus;v</b></p> </td>
<td width="8%"></td>
<td width="24%">
<p style="margin-top: 1em" valign="top">Be more
verbose.</p> </td>
<td width="54%">
</td>
</table>
<p style="margin-left:11%;"><b>&minus;h,
&minus;help</b></p>
<p style="margin-left:22%;">A short usage summary.</p>
<p style="margin-left:11%;"><b>&minus;version</b></p>
<p style="margin-left:22%;">Print the version numbers of
the relevant libraries used.</p>
<a name="PER-FRAME OPTIONS"></a>
<h2>PER-FRAME OPTIONS</h2>
<p style="margin-left:11%; margin-top: 1em">The per-frame
options are applied for the images following as arguments in
the command line. They can be modified any number of times
preceding each particular input image.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;d</b>
<i>int</i></p> </td>
<td width="2%"></td>
<td width="66%">
<p style="margin-top: 1em" valign="top">Specify the image
duration in milliseconds.</p></td>
<td width="12%">
</td>
</table>
<p style="margin-left:11%;"><b>&minus;lossless,
&minus;lossy</b></p>
<p style="margin-left:22%;">Compress the next image(s)
using lossless or lossy compression mode. The default mode
is lossless.</p>
<p style="margin-left:11%;"><b>&minus;q</b>
<i>float</i></p>
<p style="margin-left:22%;">Specify the compression factor
between 0 and 100. The default is 75.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;m</b>
<i>int</i></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Specify the
compression method to use. This parameter controls the trade
off between encoding speed and the compressed file size and
quality. Possible values range from 0 to 6. Default value is
4.</p> </td>
</table>
<a name="EXAMPLE"></a>
<h2>EXAMPLE</h2>
<p style="margin-left:11%; margin-top: 1em">img2webp -loop
2 in0.png -lossy in1.jpg -d 80 in2.tiff -o out.webp</p>
<a name="BUGS"></a>
<h2>BUGS</h2>
<p style="margin-left:11%; margin-top: 1em">Please report
all bugs to the issue tracker:
https://bugs.chromium.org/p/webp <br>
Patches welcome! See this page to get started:
https://www.webmproject.org/code/contribute/submitting&minus;patches/</p>
<a name="AUTHORS"></a>
<h2>AUTHORS</h2>
<p style="margin-left:11%; margin-top: 1em"><b>img2webp</b>
is a part of libwebp and was written by the WebP team. <br>
The latest source tree is available at
https://chromium.googlesource.com/webm/libwebp</p>
<p style="margin-left:11%; margin-top: 1em">This manual
page was written by Pascal Massimino
&lt;pascal.massimino@gmail.com&gt;, for the Debian project
(and may be used by others).</p>
<a name="SEE ALSO"></a>
<h2>SEE ALSO</h2>
<p style="margin-left:11%; margin-top: 1em"><b>webpmux</b>(1),
<b>gif2webp</b>(1) <br>
Please refer to https://developers.google.com/speed/webp/
for additional information.</p>
<hr>
</body>
</html>
@@ -0,0 +1,108 @@
IMG2WEBP(1) IMG2WEBP(1)
NAME
img2webp - create animated WebP file from a sequence of input images.
SYNOPSIS
img2webp [file_options] [[frame_options] frame_file]...
img2webp argument_file_name
DESCRIPTION
This manual page documents the img2webp command.
img2webp compresses a sequence of images using the animated WebP for-
mat. Input images can either be PNG, JPEG, TIFF or WebP. If a single
file name (not starting with the character '-') is supplied as the
argument, the command line arguments are actually tokenized from this
file. This allows for easy scripting or using a large number of argu-
ments.
FILE-LEVEL OPTIONS
The file-level options are applied at the beginning of the compression
process, before the input frames are read.
-o string
Specify the name of the output WebP file.
-min_size
Encode images to achieve smallest size. This disables key frame
insertion and picks the parameters resulting in the smallest
output for each frame. It uses lossless compression by default,
but can be combined with -q, -m, -lossy or -mixed options.
-kmin int
-kmax int
Specify the minimum and maximum distance between consecutive key
frames (independently decodable frames) in the output animation.
The tool will insert some key frames into the output animation
as needed so that this criteria is satisfied.
-mixed Mixed compression mode: optimize compression of the image
by picking either lossy or lossless compression for each frame
heuristically. This global option disables the local option
-lossy and -lossless .
-loop int
Specifies the number of times the animation should loop. Using
'0' means 'loop indefinitely'.
-v Be more verbose.
-h, -help
A short usage summary.
-version
Print the version numbers of the relevant libraries used.
PER-FRAME OPTIONS
The per-frame options are applied for the images following as arguments
in the command line. They can be modified any number of times preceding
each particular input image.
-d int Specify the image duration in milliseconds.
-lossless, -lossy
Compress the next image(s) using lossless or lossy compression
mode. The default mode is lossless.
-q float
Specify the compression factor between 0 and 100. The default is
75.
-m int Specify the compression method to use. This parameter controls
the trade off between encoding speed and the compressed file
size and quality. Possible values range from 0 to 6. Default
value is 4.
EXAMPLE
img2webp -loop 2 in0.png -lossy in1.jpg -d 80 in2.tiff -o out.webp
BUGS
Please report all bugs to the issue tracker:
https://bugs.chromium.org/p/webp
Patches welcome! See this page to get started: https://www.webmpro-
ject.org/code/contribute/submitting-patches/
AUTHORS
img2webp is a part of libwebp and was written by the WebP team.
The latest source tree is available at https://chromium.google-
source.com/webm/libwebp
This manual page was written by Pascal Massimino <pascal.mas-
simino@gmail.com>, for the Debian project (and may be used by others).
SEE ALSO
webpmux(1), gif2webp(1)
Please refer to https://developers.google.com/speed/webp/ for addi-
tional information.
January 5, 2022 IMG2WEBP(1)
@@ -0,0 +1,512 @@
# WebP tools
## Encoding tool
The examples/ directory contains tools for encoding (cwebp) and decoding (dwebp)
images.
The easiest use should look like:
```shell
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:
```shell
> 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. Note: Animated PNG and WebP files are not supported.
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)
-qrange <min> <max> .... specifies the permissible quality range
(default: 0 100)
-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:
```shell
cd examples
./dwebp test.webp -ppm -o test.ppm
diff test.ppm test_ref.ppm
```
The full list of options is available using -h:
```shell
> dwebp -h
Usage: dwebp in_file [options] [-o out_file]
```
Decodes the WebP image file to PNG format [Default]. Note: Animated WebP files
are not supported.
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> ......... resize 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:
```shell
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:
```shell
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
-usebgcolor .. display background color
-mt .......... use multi-threading
-info ........ print info
-h ........... this help message
```
Keyboard shortcuts:
```
'c' ................ toggle use of color profile
'b' ................ toggle background color display
'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)
1. Download qcms from Mozilla / Chromium:
https://hg.mozilla.org/mozilla-central/file/0e7639e3bdfb/gfx/qcms
https://source.chromium.org/chromium/chromium/src/+/main:third_party/qcms/;drc=d4a2f8e1ed461d8fc05ed88d1ae2dc94c9773825
2. Build and archive the source files as libqcms.a / qcms.lib
3. Update makefile.unix / Makefile.vc
1. Define WEBP_HAVE_QCMS
2. Update include / library paths to reference the qcms directory.
Build using makefile.unix / Makefile.vc:
```shell
$ 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:
```shell
img2webp [file_options] [[frame_options] frame_file]...
```
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`
Note: if a single file name is passed as the argument, the arguments will be
tokenized from this file. The file name must not start with the character '-'.
## 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:
```shell
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:
```shell
$ make -f makefile.unix examples/gif2webp
```
or using autoconf:
```shell
$ ./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:
```shell
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 installed, anim_diff can be built using
makefile.unix:
```shell
$ make -f makefile.unix examples/anim_diff
```
or using autoconf:
```shell
$ ./configure --enable-everything
$ make
```
## WebP Mux tool
The examples/ directory contains a tool (webpmux) for manipulating WebP files.
The webpmux tool can be used to create an extended format WebP file and also to
extract or strip relevant data from such a file.
A list of options is available using the -help command line flag:
```shell
> webpmux -help
Usage: webpmux -get GET_OPTIONS INPUT -o OUTPUT
webpmux -set SET_OPTIONS INPUT -o OUTPUT
webpmux -duration DURATION_OPTIONS [-duration ...]
INPUT -o OUTPUT
webpmux -strip STRIP_OPTIONS INPUT -o OUTPUT
webpmux -frame FRAME_OPTIONS [-frame...] [-loop LOOP_COUNT]
[-bgcolor BACKGROUND_COLOR] -o OUTPUT
webpmux -info INPUT
webpmux [-h|-help]
webpmux -version
webpmux argument_file_name
GET_OPTIONS:
Extract relevant data:
icc get ICC profile
exif get EXIF metadata
xmp get XMP metadata
frame n get nth frame
SET_OPTIONS:
Set color profile/metadata/parameters:
loop LOOP_COUNT set the loop count
bgcolor BACKGROUND_COLOR set the animation background color
icc file.icc set ICC profile
exif file.exif set EXIF metadata
xmp file.xmp set XMP metadata
where: 'file.icc' contains the ICC profile to be set,
'file.exif' contains the EXIF metadata to be set
'file.xmp' contains the XMP metadata to be set
DURATION_OPTIONS:
Set duration of selected frames:
duration set duration for all frames
duration,frame set duration of a particular frame
duration,start,end set duration of frames in the
interval [start,end])
where: 'duration' is the duration in milliseconds
'start' is the start frame index
'end' is the inclusive end frame index
The special 'end' value '0' means: last frame.
STRIP_OPTIONS:
Strip color profile/metadata:
icc strip ICC profile
exif strip EXIF metadata
xmp strip XMP metadata
FRAME_OPTIONS(i):
Create animation:
file_i +di[+xi+yi[+mi[bi]]]
where: 'file_i' is the i'th animation frame (WebP format),
'di' is the pause duration before next frame,
'xi','yi' specify the image offset for this frame,
'mi' is the dispose method for this frame (0 or 1),
'bi' is the blending method for this frame (+b or -b)
LOOP_COUNT:
Number of times to repeat the animation.
Valid range is 0 to 65535 [Default: 0 (infinite)].
BACKGROUND_COLOR:
Background color of the canvas.
A,R,G,B
where: 'A', 'R', 'G' and 'B' are integers in the range 0 to 255 specifying
the Alpha, Red, Green and Blue component values respectively
[Default: 255,255,255,255]
INPUT & OUTPUT are in WebP format.
Note: The nature of EXIF, XMP and ICC data is not checked and is assumed to be
valid.
Note: if a single file name is passed as the argument, the arguments will be
tokenized from this file. The file name must not start with the character '-'.
```
@@ -0,0 +1,288 @@
<!-- Creator : groff version 1.19.2 -->
<!-- CreationDate: Fri Aug 5 18:48:54 2022 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="generator" content="groff -Thtml, see www.gnu.org">
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<meta name="Content-Style" content="text/css">
<style type="text/css">
p { margin-top: 0; margin-bottom: 0; }
pre { margin-top: 0; margin-bottom: 0; }
table { margin-top: 0; margin-bottom: 0; }
</style>
<title>VWEBP</title>
</head>
<body>
<h1 align=center>VWEBP</h1>
<a href="#NAME">NAME</a><br>
<a href="#SYNOPSIS">SYNOPSIS</a><br>
<a href="#DESCRIPTION">DESCRIPTION</a><br>
<a href="#OPTIONS">OPTIONS</a><br>
<a href="#KEYBOARD SHORTCUTS">KEYBOARD SHORTCUTS</a><br>
<a href="#BUGS">BUGS</a><br>
<a href="#EXAMPLES">EXAMPLES</a><br>
<a href="#AUTHORS">AUTHORS</a><br>
<a href="#SEE ALSO">SEE ALSO</a><br>
<hr>
<a name="NAME"></a>
<h2>NAME</h2>
<p style="margin-left:11%; margin-top: 1em">vwebp &minus;
decompress a WebP file and display it in a window</p>
<a name="SYNOPSIS"></a>
<h2>SYNOPSIS</h2>
<p style="margin-left:11%; margin-top: 1em"><b>vwebp</b>
[<i>options</i>] <i>input_file.webp</i></p>
<a name="DESCRIPTION"></a>
<h2>DESCRIPTION</h2>
<p style="margin-left:11%; margin-top: 1em">This manual
page documents the <b>vwebp</b> command.</p>
<p style="margin-left:11%; margin-top: 1em"><b>vwebp</b>
decompresses a WebP file and displays it in a window using
OpenGL.</p>
<a name="OPTIONS"></a>
<h2>OPTIONS</h2>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="3%">
<p style="margin-top: 1em" valign="top"><b>&minus;h</b></p> </td>
<td width="8%"></td>
<td width="30%">
<p style="margin-top: 1em" valign="top">Print usage
summary.</p> </td>
<td width="48%">
</td>
</table>
<p style="margin-left:11%;"><b>&minus;version</b></p>
<p style="margin-left:22%;">Print version number and
exit.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;noicc</b></p> </td>
<td width="2%"></td>
<td width="56%">
<p style="margin-top: 1em" valign="top">Don&rsquo;t use the
ICC profile if present.</p></td>
<td width="22%">
</td>
</table>
<p style="margin-left:11%;"><b>&minus;nofancy</b></p>
<p style="margin-left:22%;">Don&rsquo;t use the fancy
YUV420 upscaler.</p>
<p style="margin-left:11%;"><b>&minus;nofilter</b></p>
<p style="margin-left:22%;">Disable in-loop filtering.</p>
<p style="margin-left:11%;"><b>&minus;dither</b>
<i>strength</i></p>
<p style="margin-left:22%;">Specify a dithering
<b>strength</b> between 0 and 100. Dithering is a
post-processing effect applied to chroma components in lossy
compression. It helps by smoothing gradients and avoiding
banding artifacts. Default: 50.</p>
<p style="margin-left:11%;"><b>&minus;noalphadither</b></p>
<p style="margin-left:22%;">By default, quantized
transparency planes are dithered during decompression, to
smooth the gradients. This flag will prevent this
dithering.</p>
<p style="margin-left:11%;"><b>&minus;usebgcolor</b></p>
<p style="margin-left:22%;">Fill transparent areas with the
bitstream&rsquo;s own background color instead of
checkerboard only. Default is white for non-animated
images.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="7%">
<p style="margin-top: 1em" valign="top"><b>&minus;mt</b></p> </td>
<td width="4%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Use multi-threading
for decoding, if possible.</p></td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="7%">
<p style="margin-top: 1em" valign="top"><b>&minus;info</b></p> </td>
<td width="4%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Display image
information on top of the decoded image.</p></td>
</table>
<p style="margin-left:11%;"><b>&minus;&minus;</b>
<i>string</i></p>
<p style="margin-left:22%;">Explicitly specify the input
file. This option is useful if the input file starts with an
&rsquo;&minus;&rsquo; for instance. This option must appear
<b>last</b>. Any other options afterward will be ignored. If
the input file is &quot;&minus;&quot;, the data will be read
from <i>stdin</i> instead of a file.</p>
<a name="KEYBOARD SHORTCUTS"></a>
<h2>KEYBOARD SHORTCUTS</h2>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="4%">
<p style="margin-top: 1em" valign="top"><b>&rsquo;c&rsquo;</b></p> </td>
<td width="7%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Toggle use of color
profile.</p> </td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="4%">
<p style="margin-top: 1em" valign="top"><b>&rsquo;b&rsquo;</b></p> </td>
<td width="7%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Toggle display of
background color.</p></td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="4%">
<p style="margin-top: 1em" valign="top"><b>&rsquo;i&rsquo;</b></p> </td>
<td width="7%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Overlay file
information.</p> </td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="4%">
<p style="margin-top: 1em" valign="top"><b>&rsquo;d&rsquo;</b></p> </td>
<td width="7%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Disable blending
and disposal process, for debugging purposes.</p></td>
</table>
<p style="margin-left:11%;"><b>&rsquo;q&rsquo; /
&rsquo;Q&rsquo; / ESC</b></p>
<p style="margin-left:22%;">Quit.</p>
<a name="BUGS"></a>
<h2>BUGS</h2>
<p style="margin-left:11%; margin-top: 1em">Please report
all bugs to the issue tracker:
https://bugs.chromium.org/p/webp <br>
Patches welcome! See this page to get started:
https://www.webmproject.org/code/contribute/submitting&minus;patches/</p>
<a name="EXAMPLES"></a>
<h2>EXAMPLES</h2>
<p style="margin-left:11%; margin-top: 1em">vwebp
picture.webp <br>
vwebp picture.webp -mt -dither 0 <br>
vwebp &minus;&minus; &minus;&minus;&minus;picture.webp</p>
<a name="AUTHORS"></a>
<h2>AUTHORS</h2>
<p style="margin-left:11%; margin-top: 1em"><b>vwebp</b> is
a part of libwebp and was written by the WebP team. <br>
The latest source tree is available at
https://chromium.googlesource.com/webm/libwebp</p>
<p style="margin-left:11%; margin-top: 1em">This manual
page was written for the Debian project (and may be used by
others).</p>
<a name="SEE ALSO"></a>
<h2>SEE ALSO</h2>
<p style="margin-left:11%; margin-top: 1em"><b>dwebp</b>(1)
<br>
Please refer to https://developers.google.com/speed/webp/
for additional information.</p>
<hr>
</body>
</html>
@@ -0,0 +1,103 @@
VWEBP(1) VWEBP(1)
NAME
vwebp - decompress a WebP file and display it in a window
SYNOPSIS
vwebp [options] input_file.webp
DESCRIPTION
This manual page documents the vwebp command.
vwebp decompresses a WebP file and displays it in a window using
OpenGL.
OPTIONS
-h Print usage summary.
-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 strength
Specify a dithering strength between 0 and 100. Dithering is a
post-processing effect applied to chroma components in lossy
compression. It helps by smoothing gradients and avoiding band-
ing artifacts. Default: 50.
-noalphadither
By default, quantized transparency planes are dithered during
decompression, to smooth the gradients. This flag will prevent
this dithering.
-usebgcolor
Fill transparent areas with the bitstream's own background color
instead of checkerboard only. Default is white for non-animated
images.
-mt Use multi-threading for decoding, if possible.
-info Display image information on top of the decoded image.
-- string
Explicitly specify the input file. This option is useful if the
input file starts with an '-' for instance. This option must
appear last. Any other options afterward will be ignored. If
the input file is "-", the data will be read from stdin instead
of a file.
KEYBOARD SHORTCUTS
'c' Toggle use of color profile.
'b' Toggle display of background color.
'i' Overlay file information.
'd' Disable blending and disposal process, for debugging purposes.
'q' / 'Q' / ESC
Quit.
BUGS
Please report all bugs to the issue tracker:
https://bugs.chromium.org/p/webp
Patches welcome! See this page to get started: https://www.webmpro-
ject.org/code/contribute/submitting-patches/
EXAMPLES
vwebp picture.webp
vwebp picture.webp -mt -dither 0
vwebp -- ---picture.webp
AUTHORS
vwebp is a part of libwebp and was written by the WebP team.
The latest source tree is available at https://chromium.google-
source.com/webm/libwebp
This manual page was written for the Debian project (and may be used by
others).
SEE ALSO
dwebp(1)
Please refer to https://developers.google.com/speed/webp/ for addi-
tional information.
November 17, 2021 VWEBP(1)
@@ -0,0 +1,184 @@
<!-- Creator : groff version 1.19.2 -->
<!-- CreationDate: Fri Aug 5 18:48:55 2022 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="generator" content="groff -Thtml, see www.gnu.org">
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<meta name="Content-Style" content="text/css">
<style type="text/css">
p { margin-top: 0; margin-bottom: 0; }
pre { margin-top: 0; margin-bottom: 0; }
table { margin-top: 0; margin-bottom: 0; }
</style>
<title>WEBPINFO</title>
</head>
<body>
<h1 align=center>WEBPINFO</h1>
<a href="#NAME">NAME</a><br>
<a href="#SYNOPSIS">SYNOPSIS</a><br>
<a href="#DESCRIPTION">DESCRIPTION</a><br>
<a href="#OPTIONS">OPTIONS</a><br>
<a href="#INPUT">INPUT</a><br>
<a href="#BUGS">BUGS</a><br>
<a href="#EXAMPLES">EXAMPLES</a><br>
<a href="#AUTHORS">AUTHORS</a><br>
<a href="#SEE ALSO">SEE ALSO</a><br>
<hr>
<a name="NAME"></a>
<h2>NAME</h2>
<p style="margin-left:11%; margin-top: 1em">webpinfo
&minus; print out the chunk level structure of WebP files
along with basic integrity checks.</p>
<a name="SYNOPSIS"></a>
<h2>SYNOPSIS</h2>
<p style="margin-left:11%; margin-top: 1em"><b>webpinfo</b>
<i>OPTIONS INPUT</i> <b><br>
webpinfo
[&minus;h|&minus;help|&minus;H|&minus;longhelp]</b></p>
<a name="DESCRIPTION"></a>
<h2>DESCRIPTION</h2>
<p style="margin-left:11%; margin-top: 1em">This manual
page documents the <b>webpinfo</b> command.</p>
<p style="margin-left:11%; margin-top: 1em"><b>webpinfo</b>
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.</p>
<a name="OPTIONS"></a>
<h2>OPTIONS</h2>
<p style="margin-left:11%; margin-top: 1em"><b>&minus;version</b></p>
<p style="margin-left:22%;">Print the version number (as
major.minor.revision) and exit.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;quiet</b></p> </td>
<td width="2%"></td>
<td width="58%">
<p style="margin-top: 1em" valign="top">Do not show chunk
parsing information.</p></td>
<td width="20%">
</td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;diag</b></p> </td>
<td width="2%"></td>
<td width="58%">
<p style="margin-top: 1em" valign="top">Show parsing error
diagnosis.</p> </td>
<td width="20%">
</td>
</table>
<p style="margin-left:11%;"><b>&minus;summary</b></p>
<p style="margin-left:22%;">Show chunk stats summary.</p>
<p style="margin-left:11%;"><b>&minus;bitstream_info</b></p>
<p style="margin-left:22%;">Parse bitstream header.</p>
<p style="margin-left:11%;"><b>&minus;h,
&minus;help</b></p>
<p style="margin-left:22%;">A short usage summary.</p>
<p style="margin-left:11%;"><b>&minus;H,
&minus;longhelp</b></p>
<p style="margin-left:22%;">Detailed usage
instructions.</p>
<a name="INPUT"></a>
<h2>INPUT</h2>
<p style="margin-left:11%; margin-top: 1em">Input files in
WebP format. Input files must come last, following options
(if any). There can be multiple input files.</p>
<a name="BUGS"></a>
<h2>BUGS</h2>
<p style="margin-left:11%; margin-top: 1em">Please report
all bugs to the issue tracker:
https://bugs.chromium.org/p/webp <br>
Patches welcome! See this page to get started:
https://www.webmproject.org/code/contribute/submitting&minus;patches/</p>
<a name="EXAMPLES"></a>
<h2>EXAMPLES</h2>
<p style="margin-left:11%; margin-top: 1em">webpinfo
&minus;h <br>
webpinfo &minus;diag &minus;summary input_file.webp <br>
webpinfo &minus;bitstream_info input_file_1.webp
input_file_2.webp <br>
webpinfo *.webp</p>
<a name="AUTHORS"></a>
<h2>AUTHORS</h2>
<p style="margin-left:11%; margin-top: 1em"><b>webpinfo</b>
is a part of libwebp and was written by the WebP team. <br>
The latest source tree is available at
https://chromium.googlesource.com/webm/libwebp</p>
<p style="margin-left:11%; margin-top: 1em">This manual
page was written by Hui Su &lt;huisu@google.com&gt;, for the
Debian project (and may be used by others).</p>
<a name="SEE ALSO"></a>
<h2>SEE ALSO</h2>
<p style="margin-left:11%; margin-top: 1em"><b>webpmux</b>(1)
<br>
Please refer to https://developers.google.com/speed/webp/
for additional information.</p>
<hr>
</body>
</html>
@@ -0,0 +1,78 @@
WEBPINFO(1) WEBPINFO(1)
NAME
webpinfo - print out the chunk level structure of WebP files along with
basic integrity checks.
SYNOPSIS
webpinfo OPTIONS INPUT
webpinfo [-h|-help|-H|-longhelp]
DESCRIPTION
This manual page documents the webpinfo command.
webpinfo can be used to print out the chunk level structure and bit-
stream header information of WebP files. It can also check if the files
are of valid WebP format.
OPTIONS
-version
Print the version number (as major.minor.revision) and exit.
-quiet Do not show chunk parsing information.
-diag Show parsing error diagnosis.
-summary
Show chunk stats summary.
-bitstream_info
Parse bitstream header.
-h, -help
A short usage summary.
-H, -longhelp
Detailed usage instructions.
INPUT
Input files in WebP format. Input files must come last, following
options (if any). There can be multiple input files.
BUGS
Please report all bugs to the issue tracker:
https://bugs.chromium.org/p/webp
Patches welcome! See this page to get started: https://www.webmpro-
ject.org/code/contribute/submitting-patches/
EXAMPLES
webpinfo -h
webpinfo -diag -summary input_file.webp
webpinfo -bitstream_info input_file_1.webp input_file_2.webp
webpinfo *.webp
AUTHORS
webpinfo is a part of libwebp and was written by the WebP team.
The latest source tree is available at https://chromium.google-
source.com/webm/libwebp
This manual page was written by Hui Su <huisu@google.com>, for the
Debian project (and may be used by others).
SEE ALSO
webpmux(1)
Please refer to https://developers.google.com/speed/webp/ for addi-
tional information.
November 17, 2021 WEBPINFO(1)
@@ -0,0 +1,436 @@
<!-- Creator : groff version 1.19.2 -->
<!-- CreationDate: Fri Aug 5 18:48:54 2022 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="generator" content="groff -Thtml, see www.gnu.org">
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<meta name="Content-Style" content="text/css">
<style type="text/css">
p { margin-top: 0; margin-bottom: 0; }
pre { margin-top: 0; margin-bottom: 0; }
table { margin-top: 0; margin-bottom: 0; }
</style>
<title>WEBPMUX</title>
</head>
<body>
<h1 align=center>WEBPMUX</h1>
<a href="#NAME">NAME</a><br>
<a href="#SYNOPSIS">SYNOPSIS</a><br>
<a href="#DESCRIPTION">DESCRIPTION</a><br>
<a href="#OPTIONS">OPTIONS</a><br>
<a href="#BUGS">BUGS</a><br>
<a href="#EXAMPLES">EXAMPLES</a><br>
<a href="#AUTHORS">AUTHORS</a><br>
<a href="#SEE ALSO">SEE ALSO</a><br>
<hr>
<a name="NAME"></a>
<h2>NAME</h2>
<p style="margin-left:11%; margin-top: 1em">webpmux &minus;
create animated WebP files from non&minus;animated WebP
images, extract frames from animated WebP images, and manage
XMP/EXIF metadata and ICC profile.</p>
<a name="SYNOPSIS"></a>
<h2>SYNOPSIS</h2>
<p style="margin-left:11%; margin-top: 1em"><b>webpmux
&minus;get</b> <i>GET_OPTIONS INPUT</i> <b>&minus;o</b>
<i>OUTPUT</i> <b><br>
webpmux &minus;set</b> <i>SET_OPTIONS INPUT</i>
<b>&minus;o</b> <i>OUTPUT</i> <b><br>
webpmux &minus;strip</b> <i>STRIP_OPTIONS INPUT</i>
<b>&minus;o</b> <i>OUTPUT</i> <b><br>
webpmux &minus;frame</b> <i>FRAME_OPTIONS</i> <b>[
&minus;frame ... ] [ &minus;loop</b> <i>LOOP_COUNT</i>
<b>]</b></p>
<p style="margin-left:23%;"><b>[ &minus;bgcolor</b>
<i>BACKGROUND_COLOR</i> <b>] &minus;o</b> <i>OUTPUT</i></p>
<p style="margin-left:11%;"><b>webpmux &minus;duration</b>
<i>DURATION OPTIONS</i> <b>[ &minus;duration ... ]</b>
<i>INPUT</i> <b>&minus;o</b> <i>OUTPUT</i> <b><br>
webpmux &minus;info</b> <i>INPUT</i> <b><br>
webpmux [&minus;h|&minus;help] <br>
webpmux &minus;version <br>
webpmux argument_file_name</b></p>
<a name="DESCRIPTION"></a>
<h2>DESCRIPTION</h2>
<p style="margin-left:11%; margin-top: 1em">This manual
page documents the <b>webpmux</b> command.</p>
<p style="margin-left:11%; margin-top: 1em"><b>webpmux</b>
can be used to create/extract from animated WebP files, as
well as to add/extract/strip XMP/EXIF metadata and ICC
profile. If a single file name (not starting with the
character &rsquo;&minus;&rsquo;) is supplied as the
argument, the command line arguments are actually tokenized
from this file. This allows for easy scripting or using a
large number of arguments.</p>
<a name="OPTIONS"></a>
<h2>OPTIONS</h2>
<p style="margin-left:11%; margin-top: 1em"><b>GET_OPTIONS
(&minus;get):</b></p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="6%">
<p valign="top"><b>icc</b></p></td>
<td width="5%"></td>
<td width="27%">
<p valign="top">Get ICC profile.</p></td>
<td width="51%">
</td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="6%">
<p style="margin-top: 1em" valign="top"><b>exif</b></p></td>
<td width="5%"></td>
<td width="27%">
<p style="margin-top: 1em" valign="top">Get EXIF
metadata.</p> </td>
<td width="51%">
</td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="6%">
<p style="margin-top: 1em" valign="top"><b>xmp</b></p></td>
<td width="5%"></td>
<td width="27%">
<p style="margin-top: 1em" valign="top">Get XMP
metadata.</p> </td>
<td width="51%">
</td>
</table>
<p style="margin-left:11%;"><b>frame</b> <i>n</i></p>
<p style="margin-left:22%;">Get nth frame from an animated
image. (n = 0 has a special meaning: last frame).</p>
<p style="margin-left:11%; margin-top: 1em"><b>SET_OPTIONS
(&minus;set) <br>
loop</b> <i>loop_count</i></p>
<p style="margin-left:22%;">Set loop count on an animated
file.</p>
<p style="margin-left:11%; margin-top: 1em">Where:
&rsquo;loop_count&rsquo; must be in range [0, 65535].
<b><br>
bgcolor</b> <i>A,R,G,B</i></p>
<p style="margin-left:22%;">Set the background color of the
canvas on an animated file.</p>
<p style="margin-left:11%; margin-top: 1em">where:
&rsquo;A&rsquo;, &rsquo;R&rsquo;, &rsquo;G&rsquo; and
&rsquo;B&rsquo; are integers in the range 0 to 255
specifying the Alpha, Red, Green and Blue component values
respectively. <b><br>
icc</b> <i>file.icc</i></p>
<p style="margin-left:22%;">Set ICC profile.</p>
<p style="margin-left:11%; margin-top: 1em">Where:
&rsquo;file.icc&rsquo; contains the ICC profile to be set.
<b><br>
exif</b> <i>file.exif</i></p>
<p style="margin-left:22%;">Set EXIF metadata.</p>
<p style="margin-left:11%; margin-top: 1em">Where:
&rsquo;file.exif&rsquo; contains the EXIF metadata to be
set. <b><br>
xmp</b> <i>file.xmp</i></p>
<p style="margin-left:22%;">Set XMP metadata.</p>
<p style="margin-left:11%; margin-top: 1em">Where:
&rsquo;file.xmp&rsquo; contains the XMP metadata to be
set.</p>
<p style="margin-left:11%; margin-top: 1em"><b>STRIP_OPTIONS
(&minus;strip)</b></p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="6%">
<p valign="top"><b>icc</b></p></td>
<td width="5%"></td>
<td width="30%">
<p valign="top">Strip ICC profile.</p></td>
<td width="48%">
</td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="6%">
<p style="margin-top: 1em" valign="top"><b>exif</b></p></td>
<td width="5%"></td>
<td width="30%">
<p style="margin-top: 1em" valign="top">Strip EXIF
metadata.</p> </td>
<td width="48%">
</td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="6%">
<p style="margin-top: 1em" valign="top"><b>xmp</b></p></td>
<td width="5%"></td>
<td width="30%">
<p style="margin-top: 1em" valign="top">Strip XMP
metadata.</p> </td>
<td width="48%">
</td>
</table>
<p style="margin-left:11%; margin-top: 1em"><b>DURATION_OPTIONS
(&minus;duration)</b> <br>
Amend the duration of a specific interval of frames. This
option is only effective on animated WebP and has no effect
on a single-frame file. <i><br>
duration[,start[,end]]</i></p>
<p style="margin-left:22%;">Where: <b><br>
duration</b> is the duration for the interval in
milliseconds (mandatory). Must be non-negative. <b><br>
start</b> is the starting frame index of the interval
(optional). <b><br>
end</b> is the ending frame index (inclusive) of the
interval (optional).</p>
<p style="margin-left:11%;">The three typical usages of
this option are:</p>
<p style="margin-left:22%;"><b>-duration d</b> <br>
set the duration to &rsquo;d&rsquo; for the whole animation.
<b><br>
-duration d,f</b> <br>
set the duration of frame &rsquo;f&rsquo; to
&rsquo;d&rsquo;. <b><br>
-duration d,start,end</b> <br>
set the duration to &rsquo;d&rsquo; for the whole
[start,end] interval.</p>
<p style="margin-left:22%; margin-top: 1em">Note that the
frames outside of the [start, end] interval will <br>
remain untouched. <br>
The &rsquo;end&rsquo; value &rsquo;0&rsquo; has the special
meaning &rsquo;last frame of the animation&rsquo;.</p>
<p style="margin-left:11%;"><i>Reminder:</i></p>
<p style="margin-left:22%;">frame indexing starts at
&rsquo;1&rsquo;.</p>
<p style="margin-left:11%; margin-top: 1em"><b>FRAME_OPTIONS
(&minus;frame)</b> <br>
Create an animated WebP file from multiple
(non&minus;animated) WebP images. <i><br>
file_i +di[+xi+yi[+mi[bi]]]</i></p>
<p style="margin-left:22%;">Where: &rsquo;file_i&rsquo; is
the i&rsquo;th frame (WebP format),
&rsquo;xi&rsquo;,&rsquo;yi&rsquo; specify the image offset
for this frame, &rsquo;di&rsquo; is the pause duration
before next frame, &rsquo;mi&rsquo; is the dispose method
for this frame (0 for NONE or 1 for BACKGROUND) and
&rsquo;bi&rsquo; is the blending method for this frame (+b
for BLEND or &minus;b for NO_BLEND). Argument
&rsquo;bi&rsquo; can be omitted and will default to +b
(BLEND). Also, &rsquo;mi&rsquo; can be omitted if
&rsquo;bi&rsquo; is omitted and will default to 0 (NONE).
Finally, if &rsquo;mi&rsquo; and &rsquo;bi&rsquo; are
omitted then &rsquo;xi&rsquo; and &rsquo;yi&rsquo; can be
omitted and will default to +0+0.</p>
<p style="margin-left:11%;"><b>&minus;loop</b> <i>n</i></p>
<p style="margin-left:22%;">Loop the frames n number of
times. 0 indicates the frames should loop forever. Valid
range is 0 to 65535 [Default: 0 (infinite)].</p>
<p style="margin-left:11%;"><b>&minus;bgcolor</b>
<i>A,R,G,B</i></p>
<p style="margin-left:22%;">Background color of the canvas.
<br>
where: &rsquo;A&rsquo;, &rsquo;R&rsquo;, &rsquo;G&rsquo; and
&rsquo;B&rsquo; are integers in the range 0 to 255
specifying the Alpha, Red, Green and Blue component values
respectively [Default: 255,255,255,255].</p>
<p style="margin-left:11%; margin-top: 1em"><b>INPUT</b>
<br>
Input file in WebP format.</p>
<p style="margin-left:11%; margin-top: 1em"><b>OUTPUT
(&minus;o)</b> <br>
Output file in WebP format.</p>
<p style="margin-left:11%; margin-top: 1em"><b>Note:</b>
<br>
The nature of EXIF, XMP and ICC data is not checked and is
assumed to <br>
be valid.</p>
<a name="BUGS"></a>
<h2>BUGS</h2>
<p style="margin-left:11%; margin-top: 1em">Please report
all bugs to the issue tracker:
https://bugs.chromium.org/p/webp <br>
Patches welcome! See this page to get started:
https://www.webmproject.org/code/contribute/submitting&minus;patches/</p>
<a name="EXAMPLES"></a>
<h2>EXAMPLES</h2>
<p style="margin-left:11%; margin-top: 1em">Add ICC
profile: <br>
webpmux &minus;set icc image_profile.icc in.webp &minus;o
icc_container.webp</p>
<p style="margin-left:11%; margin-top: 1em">Extract ICC
profile: <br>
webpmux &minus;get icc icc_container.webp &minus;o
image_profile.icc</p>
<p style="margin-left:11%; margin-top: 1em">Strip ICC
profile: <br>
webpmux &minus;strip icc icc_container.webp &minus;o
without_icc.webp</p>
<p style="margin-left:11%; margin-top: 1em">Add XMP
metadata: <br>
webpmux &minus;set xmp image_metadata.xmp in.webp &minus;o
xmp_container.webp</p>
<p style="margin-left:11%; margin-top: 1em">Extract XMP
metadata: <br>
webpmux &minus;get xmp xmp_container.webp &minus;o
image_metadata.xmp</p>
<p style="margin-left:11%; margin-top: 1em">Strip XMP
metadata: <br>
webpmux &minus;strip xmp xmp_container.webp &minus;o
without_xmp.webp</p>
<p style="margin-left:11%; margin-top: 1em">Add EXIF
metadata: <br>
webpmux &minus;set exif image_metadata.exif in.webp &minus;o
exif_container.webp</p>
<p style="margin-left:11%; margin-top: 1em">Extract EXIF
metadata: <br>
webpmux &minus;get exif exif_container.webp &minus;o
image_metadata.exif</p>
<p style="margin-left:11%; margin-top: 1em">Strip EXIF
metadata: <br>
webpmux &minus;strip exif exif_container.webp &minus;o
without_exif.webp</p>
<p style="margin-left:11%; margin-top: 1em">Create an
animated WebP file from 3 (non&minus;animated) WebP images:
<br>
webpmux &minus;frame 1.webp +100 &minus;frame 2.webp
+100+50+50</p>
<p style="margin-left:23%;">&minus;frame 3.webp
+100+50+50+1+b &minus;loop 10 &minus;bgcolor 255,255,255,255
<br>
&minus;o anim_container.webp</p>
<p style="margin-left:11%; margin-top: 1em">Get the 2nd
frame from an animated WebP file: <br>
webpmux &minus;get frame 2 anim_container.webp &minus;o
frame_2.webp</p>
<p style="margin-left:11%; margin-top: 1em">Using
&minus;get/&minus;set/&minus;strip with input file name
starting with &rsquo;&minus;&rsquo;: <br>
webpmux &minus;set icc image_profile.icc &minus;o
icc_container.webp &minus;&minus;
&minus;&minus;&minus;in.webp <br>
webpmux &minus;get icc &minus;o image_profile.icc
&minus;&minus; &minus;&minus;&minus;icc_container.webp <br>
webpmux &minus;strip icc &minus;o without_icc.webp
&minus;&minus; &minus;&minus;&minus;icc_container.webp</p>
<a name="AUTHORS"></a>
<h2>AUTHORS</h2>
<p style="margin-left:11%; margin-top: 1em"><b>webpmux</b>
is a part of libwebp and was written by the WebP team. <br>
The latest source tree is available at
https://chromium.googlesource.com/webm/libwebp</p>
<p style="margin-left:11%; margin-top: 1em">This manual
page was written by Vikas Arora
&lt;vikaas.arora@gmail.com&gt;, for the Debian project (and
may be used by others).</p>
<a name="SEE ALSO"></a>
<h2>SEE ALSO</h2>
<p style="margin-left:11%; margin-top: 1em"><b>cwebp</b>(1),
<b>dwebp</b>(1), <b>gif2webp</b>(1) <br>
Please refer to https://developers.google.com/speed/webp/
for additional information.</p>
<hr>
</body>
</html>
@@ -0,0 +1,216 @@
WEBPMUX(1) WEBPMUX(1)
NAME
webpmux - create animated WebP files from non-animated WebP images,
extract frames from animated WebP images, and manage XMP/EXIF metadata
and ICC profile.
SYNOPSIS
webpmux -get GET_OPTIONS INPUT -o OUTPUT
webpmux -set SET_OPTIONS INPUT -o OUTPUT
webpmux -strip STRIP_OPTIONS INPUT -o OUTPUT
webpmux -frame FRAME_OPTIONS [ -frame ... ] [ -loop LOOP_COUNT ]
[ -bgcolor BACKGROUND_COLOR ] -o OUTPUT
webpmux -duration DURATION OPTIONS [ -duration ... ] INPUT -o OUTPUT
webpmux -info INPUT
webpmux [-h|-help]
webpmux -version
webpmux argument_file_name
DESCRIPTION
This manual page documents the webpmux command.
webpmux can be used to create/extract from animated WebP files, as well
as to add/extract/strip XMP/EXIF metadata and ICC profile. If a single
file name (not starting with the character '-') is supplied as the
argument, the command line arguments are actually tokenized from this
file. This allows for easy scripting or using a large number of argu-
ments.
OPTIONS
GET_OPTIONS (-get):
icc Get ICC profile.
exif Get EXIF metadata.
xmp Get XMP metadata.
frame n
Get nth frame from an animated image. (n = 0 has a special mean-
ing: last frame).
SET_OPTIONS (-set)
loop loop_count
Set loop count on an animated file.
Where: 'loop_count' must be in range [0, 65535].
bgcolor A,R,G,B
Set the background color of the canvas on an animated file.
where: 'A', 'R', 'G' and 'B' are integers in the range 0 to 255 speci-
fying the Alpha, Red, Green and Blue component values respectively.
icc file.icc
Set ICC profile.
Where: 'file.icc' contains the ICC profile to be set.
exif file.exif
Set EXIF metadata.
Where: 'file.exif' contains the EXIF metadata to be set.
xmp file.xmp
Set XMP metadata.
Where: 'file.xmp' contains the XMP metadata to be set.
STRIP_OPTIONS (-strip)
icc Strip ICC profile.
exif Strip EXIF metadata.
xmp Strip XMP metadata.
DURATION_OPTIONS (-duration)
Amend the duration of a specific interval of frames. This option is
only effective on animated WebP and has no effect on a single-frame
file.
duration[,start[,end]]
Where:
duration is the duration for the interval in milliseconds
(mandatory). Must be non-negative.
start is the starting frame index of the interval (optional).
end is the ending frame index (inclusive) of the interval
(optional).
The three typical usages of this option are:
-duration d
set the duration to 'd' for the whole animation.
-duration d,f
set the duration of frame 'f' to 'd'.
-duration d,start,end
set the duration to 'd' for the whole [start,end] interval.
Note that the frames outside of the [start, end] interval will
remain untouched.
The 'end' value '0' has the special meaning 'last frame of the
animation'.
Reminder:
frame indexing starts at '1'.
FRAME_OPTIONS (-frame)
Create an animated WebP file from multiple (non-animated) WebP images.
file_i +di[+xi+yi[+mi[bi]]]
Where: 'file_i' is the i'th frame (WebP format), 'xi','yi' spec-
ify the image offset for this frame, 'di' is the pause duration
before next frame, 'mi' is the dispose method for this frame (0
for NONE or 1 for BACKGROUND) and 'bi' is the blending method
for this frame (+b for BLEND or -b for NO_BLEND). Argument 'bi'
can be omitted and will default to +b (BLEND). Also, 'mi' can
be omitted if 'bi' is omitted and will default to 0 (NONE).
Finally, if 'mi' and 'bi' are omitted then 'xi' and 'yi' can be
omitted and will default to +0+0.
-loop n
Loop the frames n number of times. 0 indicates the frames should
loop forever. Valid range is 0 to 65535 [Default: 0 (infi-
nite)].
-bgcolor A,R,G,B
Background color of the canvas.
where: 'A', 'R', 'G' and 'B' are integers in the range 0 to 255
specifying the Alpha, Red, Green and Blue component values
respectively [Default: 255,255,255,255].
INPUT
Input file in WebP format.
OUTPUT (-o)
Output file in WebP format.
Note:
The nature of EXIF, XMP and ICC data is not checked and is assumed to
be valid.
BUGS
Please report all bugs to the issue tracker:
https://bugs.chromium.org/p/webp
Patches welcome! See this page to get started: https://www.webmpro-
ject.org/code/contribute/submitting-patches/
EXAMPLES
Add ICC profile:
webpmux -set icc image_profile.icc in.webp -o icc_container.webp
Extract ICC profile:
webpmux -get icc icc_container.webp -o image_profile.icc
Strip ICC profile:
webpmux -strip icc icc_container.webp -o without_icc.webp
Add XMP metadata:
webpmux -set xmp image_metadata.xmp in.webp -o xmp_container.webp
Extract XMP metadata:
webpmux -get xmp xmp_container.webp -o image_metadata.xmp
Strip XMP metadata:
webpmux -strip xmp xmp_container.webp -o without_xmp.webp
Add EXIF metadata:
webpmux -set exif image_metadata.exif in.webp -o exif_container.webp
Extract EXIF metadata:
webpmux -get exif exif_container.webp -o image_metadata.exif
Strip EXIF metadata:
webpmux -strip exif exif_container.webp -o without_exif.webp
Create an animated WebP file from 3 (non-animated) WebP images:
webpmux -frame 1.webp +100 -frame 2.webp +100+50+50
-frame 3.webp +100+50+50+1+b -loop 10 -bgcolor 255,255,255,255
-o anim_container.webp
Get the 2nd frame from an animated WebP file:
webpmux -get frame 2 anim_container.webp -o frame_2.webp
Using -get/-set/-strip with input file name starting with '-':
webpmux -set icc image_profile.icc -o icc_container.webp -- ---in.webp
webpmux -get icc -o image_profile.icc -- ---icc_container.webp
webpmux -strip icc -o without_icc.webp -- ---icc_container.webp
AUTHORS
webpmux is a part of libwebp and was written by the WebP team.
The latest source tree is available at https://chromium.google-
source.com/webm/libwebp
This manual page was written by Vikas Arora <vikaas.arora@gmail.com>,
for the Debian project (and may be used by others).
SEE ALSO
cwebp(1), dwebp(1), gif2webp(1)
Please refer to https://developers.google.com/speed/webp/ for addi-
tional information.
November 17, 2021 WEBPMUX(1)
@@ -0,0 +1,503 @@
// Copyright 2010 Google Inc. All Rights Reserved.
//
// Use of this source code is governed by a BSD-style license
// that can be found in the COPYING file in the root of the source
// tree. An additional intellectual property rights grant can be found
// in the file PATENTS. All contributing project authors may
// be found in the AUTHORS file in the root of the source tree.
// -----------------------------------------------------------------------------
//
// Main decoding functions for WebP images.
//
// Author: Skal (pascal.massimino@gmail.com)
#ifndef WEBP_WEBP_DECODE_H_
#define WEBP_WEBP_DECODE_H_
#include "./types.h"
#ifdef __cplusplus
extern "C" {
#endif
#define WEBP_DECODER_ABI_VERSION 0x0209 // MAJOR(8b) + MINOR(8b)
// Note: forward declaring enumerations is not allowed in (strict) C and C++,
// the types are left here for reference.
// typedef enum VP8StatusCode VP8StatusCode;
// typedef enum WEBP_CSP_MODE WEBP_CSP_MODE;
typedef struct WebPRGBABuffer WebPRGBABuffer;
typedef struct WebPYUVABuffer WebPYUVABuffer;
typedef struct WebPDecBuffer WebPDecBuffer;
typedef struct WebPIDecoder WebPIDecoder;
typedef struct WebPBitstreamFeatures WebPBitstreamFeatures;
typedef struct WebPDecoderOptions WebPDecoderOptions;
typedef struct WebPDecoderConfig WebPDecoderConfig;
// Return the decoder's version number, packed in hexadecimal using 8bits for
// each of major/minor/revision. E.g: v2.5.7 is 0x020507.
WEBP_EXTERN int WebPGetDecoderVersion(void);
// Retrieve basic header information: width, height.
// This function will also validate the header, returning true on success,
// false otherwise. '*width' and '*height' are only valid on successful return.
// Pointers 'width' and 'height' can be passed NULL if deemed irrelevant.
// Note: The following chunk sequences (before the raw VP8/VP8L data) are
// considered valid by this function:
// RIFF + VP8(L)
// RIFF + VP8X + (optional chunks) + VP8(L)
// ALPH + VP8 <-- Not a valid WebP format: only allowed for internal purpose.
// VP8(L) <-- Not a valid WebP format: only allowed for internal purpose.
WEBP_EXTERN int WebPGetInfo(const uint8_t* data, size_t data_size,
int* width, int* height);
// Decodes WebP images pointed to by 'data' and returns RGBA samples, along
// with the dimensions in *width and *height. The ordering of samples in
// memory is R, G, B, A, R, G, B, A... in scan order (endian-independent).
// The returned pointer should be deleted calling WebPFree().
// Returns NULL in case of error.
WEBP_EXTERN uint8_t* WebPDecodeRGBA(const uint8_t* data, size_t data_size,
int* width, int* height);
// Same as WebPDecodeRGBA, but returning A, R, G, B, A, R, G, B... ordered data.
WEBP_EXTERN uint8_t* WebPDecodeARGB(const uint8_t* data, size_t data_size,
int* width, int* height);
// Same as WebPDecodeRGBA, but returning B, G, R, A, B, G, R, A... ordered data.
WEBP_EXTERN uint8_t* WebPDecodeBGRA(const uint8_t* data, size_t data_size,
int* width, int* height);
// Same as WebPDecodeRGBA, but returning R, G, B, R, G, B... ordered data.
// If the bitstream contains transparency, it is ignored.
WEBP_EXTERN uint8_t* WebPDecodeRGB(const uint8_t* data, size_t data_size,
int* width, int* height);
// Same as WebPDecodeRGB, but returning B, G, R, B, G, R... ordered data.
WEBP_EXTERN uint8_t* WebPDecodeBGR(const uint8_t* data, size_t data_size,
int* width, int* height);
// Decode WebP images pointed to by 'data' to Y'UV format(*). The pointer
// returned is the Y samples buffer. Upon return, *u and *v will point to
// the U and V chroma data. These U and V buffers need NOT be passed to
// WebPFree(), unlike the returned Y luma one. The dimension of the U and V
// planes are both (*width + 1) / 2 and (*height + 1)/ 2.
// Upon return, the Y buffer has a stride returned as '*stride', while U and V
// have a common stride returned as '*uv_stride'.
// Return NULL in case of error.
// (*) Also named Y'CbCr. See: https://en.wikipedia.org/wiki/YCbCr
WEBP_EXTERN uint8_t* WebPDecodeYUV(const uint8_t* data, size_t data_size,
int* width, int* height,
uint8_t** u, uint8_t** v,
int* stride, int* uv_stride);
// These five functions are variants of the above ones, that decode the image
// directly into a pre-allocated buffer 'output_buffer'. The maximum storage
// available in this buffer is indicated by 'output_buffer_size'. If this
// storage is not sufficient (or an error occurred), NULL is returned.
// Otherwise, output_buffer is returned, for convenience.
// The parameter 'output_stride' specifies the distance (in bytes)
// between scanlines. Hence, output_buffer_size is expected to be at least
// output_stride x picture-height.
WEBP_EXTERN uint8_t* WebPDecodeRGBAInto(
const uint8_t* data, size_t data_size,
uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
WEBP_EXTERN uint8_t* WebPDecodeARGBInto(
const uint8_t* data, size_t data_size,
uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
WEBP_EXTERN uint8_t* WebPDecodeBGRAInto(
const uint8_t* data, size_t data_size,
uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
// RGB and BGR variants. Here too the transparency information, if present,
// will be dropped and ignored.
WEBP_EXTERN uint8_t* WebPDecodeRGBInto(
const uint8_t* data, size_t data_size,
uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
WEBP_EXTERN uint8_t* WebPDecodeBGRInto(
const uint8_t* data, size_t data_size,
uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
// WebPDecodeYUVInto() is a variant of WebPDecodeYUV() that operates directly
// into pre-allocated luma/chroma plane buffers. This function requires the
// strides to be passed: one for the luma plane and one for each of the
// chroma ones. The size of each plane buffer is passed as 'luma_size',
// 'u_size' and 'v_size' respectively.
// Pointer to the luma plane ('*luma') is returned or NULL if an error occurred
// during decoding (or because some buffers were found to be too small).
WEBP_EXTERN uint8_t* WebPDecodeYUVInto(
const uint8_t* data, size_t data_size,
uint8_t* luma, size_t luma_size, int luma_stride,
uint8_t* u, size_t u_size, int u_stride,
uint8_t* v, size_t v_size, int v_stride);
//------------------------------------------------------------------------------
// Output colorspaces and buffer
// Colorspaces
// Note: the naming describes the byte-ordering of packed samples in memory.
// For instance, MODE_BGRA relates to samples ordered as B,G,R,A,B,G,R,A,...
// Non-capital names (e.g.:MODE_Argb) relates to pre-multiplied RGB channels.
// RGBA-4444 and RGB-565 colorspaces are represented by following byte-order:
// RGBA-4444: [r3 r2 r1 r0 g3 g2 g1 g0], [b3 b2 b1 b0 a3 a2 a1 a0], ...
// RGB-565: [r4 r3 r2 r1 r0 g5 g4 g3], [g2 g1 g0 b4 b3 b2 b1 b0], ...
// In the case WEBP_SWAP_16BITS_CSP is defined, the bytes are swapped for
// these two modes:
// RGBA-4444: [b3 b2 b1 b0 a3 a2 a1 a0], [r3 r2 r1 r0 g3 g2 g1 g0], ...
// RGB-565: [g2 g1 g0 b4 b3 b2 b1 b0], [r4 r3 r2 r1 r0 g5 g4 g3], ...
typedef enum WEBP_CSP_MODE {
MODE_RGB = 0, MODE_RGBA = 1,
MODE_BGR = 2, MODE_BGRA = 3,
MODE_ARGB = 4, MODE_RGBA_4444 = 5,
MODE_RGB_565 = 6,
// RGB-premultiplied transparent modes (alpha value is preserved)
MODE_rgbA = 7,
MODE_bgrA = 8,
MODE_Argb = 9,
MODE_rgbA_4444 = 10,
// YUV modes must come after RGB ones.
MODE_YUV = 11, MODE_YUVA = 12, // yuv 4:2:0
MODE_LAST = 13
} WEBP_CSP_MODE;
// Some useful macros:
static WEBP_INLINE int WebPIsPremultipliedMode(WEBP_CSP_MODE mode) {
return (mode == MODE_rgbA || mode == MODE_bgrA || mode == MODE_Argb ||
mode == MODE_rgbA_4444);
}
static WEBP_INLINE int WebPIsAlphaMode(WEBP_CSP_MODE mode) {
return (mode == MODE_RGBA || mode == MODE_BGRA || mode == MODE_ARGB ||
mode == MODE_RGBA_4444 || mode == MODE_YUVA ||
WebPIsPremultipliedMode(mode));
}
static WEBP_INLINE int WebPIsRGBMode(WEBP_CSP_MODE mode) {
return (mode < MODE_YUV);
}
//------------------------------------------------------------------------------
// WebPDecBuffer: Generic structure for describing the output sample buffer.
struct WebPRGBABuffer { // view as RGBA
uint8_t* rgba; // pointer to RGBA samples
int stride; // stride in bytes from one scanline to the next.
size_t size; // total size of the *rgba buffer.
};
struct WebPYUVABuffer { // view as YUVA
uint8_t* y, *u, *v, *a; // pointer to luma, chroma U/V, alpha samples
int y_stride; // luma stride
int u_stride, v_stride; // chroma strides
int a_stride; // alpha stride
size_t y_size; // luma plane size
size_t u_size, v_size; // chroma planes size
size_t a_size; // alpha-plane size
};
// Output buffer
struct WebPDecBuffer {
WEBP_CSP_MODE colorspace; // Colorspace.
int width, height; // Dimensions.
int is_external_memory; // If non-zero, 'internal_memory' pointer is not
// used. If value is '2' or more, the external
// memory is considered 'slow' and multiple
// read/write will be avoided.
union {
WebPRGBABuffer RGBA;
WebPYUVABuffer YUVA;
} u; // Nameless union of buffer parameters.
uint32_t pad[4]; // padding for later use
uint8_t* private_memory; // Internally allocated memory (only when
// is_external_memory is 0). Should not be used
// externally, but accessed via the buffer union.
};
// Internal, version-checked, entry point
WEBP_EXTERN int WebPInitDecBufferInternal(WebPDecBuffer*, int);
// Initialize the structure as empty. Must be called before any other use.
// Returns false in case of version mismatch
static WEBP_INLINE int WebPInitDecBuffer(WebPDecBuffer* buffer) {
return WebPInitDecBufferInternal(buffer, WEBP_DECODER_ABI_VERSION);
}
// Free any memory associated with the buffer. Must always be called last.
// Note: doesn't free the 'buffer' structure itself.
WEBP_EXTERN void WebPFreeDecBuffer(WebPDecBuffer* buffer);
//------------------------------------------------------------------------------
// Enumeration of the status codes
typedef enum VP8StatusCode {
VP8_STATUS_OK = 0,
VP8_STATUS_OUT_OF_MEMORY,
VP8_STATUS_INVALID_PARAM,
VP8_STATUS_BITSTREAM_ERROR,
VP8_STATUS_UNSUPPORTED_FEATURE,
VP8_STATUS_SUSPENDED,
VP8_STATUS_USER_ABORT,
VP8_STATUS_NOT_ENOUGH_DATA
} VP8StatusCode;
//------------------------------------------------------------------------------
// Incremental decoding
//
// This API allows streamlined decoding of partial data.
// Picture can be incrementally decoded as data become available thanks to the
// WebPIDecoder object. This object can be left in a SUSPENDED state if the
// picture is only partially decoded, pending additional input.
// Code example:
//
// WebPInitDecBuffer(&output_buffer);
// output_buffer.colorspace = mode;
// ...
// WebPIDecoder* idec = WebPINewDecoder(&output_buffer);
// while (additional_data_is_available) {
// // ... (get additional data in some new_data[] buffer)
// status = WebPIAppend(idec, new_data, new_data_size);
// if (status != VP8_STATUS_OK && status != VP8_STATUS_SUSPENDED) {
// break; // an error occurred.
// }
//
// // The above call decodes the current available buffer.
// // Part of the image can now be refreshed by calling
// // WebPIDecGetRGB()/WebPIDecGetYUVA() etc.
// }
// WebPIDelete(idec);
// Creates a new incremental decoder with the supplied buffer parameter.
// This output_buffer can be passed NULL, in which case a default output buffer
// is used (with MODE_RGB). Otherwise, an internal reference to 'output_buffer'
// is kept, which means that the lifespan of 'output_buffer' must be larger than
// that of the returned WebPIDecoder object.
// The supplied 'output_buffer' content MUST NOT be changed between calls to
// WebPIAppend() or WebPIUpdate() unless 'output_buffer.is_external_memory' is
// not set to 0. In such a case, it is allowed to modify the pointers, size and
// stride of output_buffer.u.RGBA or output_buffer.u.YUVA, provided they remain
// within valid bounds.
// All other fields of WebPDecBuffer MUST remain constant between calls.
// Returns NULL if the allocation failed.
WEBP_EXTERN WebPIDecoder* WebPINewDecoder(WebPDecBuffer* output_buffer);
// This function allocates and initializes an incremental-decoder object, which
// will output the RGB/A samples specified by 'csp' into a preallocated
// buffer 'output_buffer'. The size of this buffer is at least
// 'output_buffer_size' and the stride (distance in bytes between two scanlines)
// is specified by 'output_stride'.
// Additionally, output_buffer can be passed NULL in which case the output
// buffer will be allocated automatically when the decoding starts. The
// colorspace 'csp' is taken into account for allocating this buffer. All other
// parameters are ignored.
// Returns NULL if the allocation failed, or if some parameters are invalid.
WEBP_EXTERN WebPIDecoder* WebPINewRGB(
WEBP_CSP_MODE csp,
uint8_t* output_buffer, size_t output_buffer_size, int output_stride);
// This function allocates and initializes an incremental-decoder object, which
// will output the raw luma/chroma samples into a preallocated planes if
// supplied. The luma plane is specified by its pointer 'luma', its size
// 'luma_size' and its stride 'luma_stride'. Similarly, the chroma-u plane
// is specified by the 'u', 'u_size' and 'u_stride' parameters, and the chroma-v
// plane by 'v' and 'v_size'. And same for the alpha-plane. The 'a' pointer
// can be pass NULL in case one is not interested in the transparency plane.
// Conversely, 'luma' can be passed NULL if no preallocated planes are supplied.
// In this case, the output buffer will be automatically allocated (using
// MODE_YUVA) when decoding starts. All parameters are then ignored.
// Returns NULL if the allocation failed or if a parameter is invalid.
WEBP_EXTERN WebPIDecoder* WebPINewYUVA(
uint8_t* luma, size_t luma_size, int luma_stride,
uint8_t* u, size_t u_size, int u_stride,
uint8_t* v, size_t v_size, int v_stride,
uint8_t* a, size_t a_size, int a_stride);
// Deprecated version of the above, without the alpha plane.
// Kept for backward compatibility.
WEBP_EXTERN WebPIDecoder* WebPINewYUV(
uint8_t* luma, size_t luma_size, int luma_stride,
uint8_t* u, size_t u_size, int u_stride,
uint8_t* v, size_t v_size, int v_stride);
// Deletes the WebPIDecoder object and associated memory. Must always be called
// if WebPINewDecoder, WebPINewRGB or WebPINewYUV succeeded.
WEBP_EXTERN void WebPIDelete(WebPIDecoder* idec);
// Copies and decodes the next available data. Returns VP8_STATUS_OK when
// the image is successfully decoded. Returns VP8_STATUS_SUSPENDED when more
// data is expected. Returns error in other cases.
WEBP_EXTERN VP8StatusCode WebPIAppend(
WebPIDecoder* idec, const uint8_t* data, size_t data_size);
// A variant of the above function to be used when data buffer contains
// partial data from the beginning. In this case data buffer is not copied
// to the internal memory.
// Note that the value of the 'data' pointer can change between calls to
// WebPIUpdate, for instance when the data buffer is resized to fit larger data.
WEBP_EXTERN VP8StatusCode WebPIUpdate(
WebPIDecoder* idec, const uint8_t* data, size_t data_size);
// Returns the RGB/A image decoded so far. Returns NULL if output params
// are not initialized yet. The RGB/A output type corresponds to the colorspace
// specified during call to WebPINewDecoder() or WebPINewRGB().
// *last_y is the index of last decoded row in raster scan order. Some pointers
// (*last_y, *width etc.) can be NULL if corresponding information is not
// needed. The values in these pointers are only valid on successful (non-NULL)
// return.
WEBP_EXTERN uint8_t* WebPIDecGetRGB(
const WebPIDecoder* idec, int* last_y,
int* width, int* height, int* stride);
// Same as above function to get a YUVA image. Returns pointer to the luma
// plane or NULL in case of error. If there is no alpha information
// the alpha pointer '*a' will be returned NULL.
WEBP_EXTERN uint8_t* WebPIDecGetYUVA(
const WebPIDecoder* idec, int* last_y,
uint8_t** u, uint8_t** v, uint8_t** a,
int* width, int* height, int* stride, int* uv_stride, int* a_stride);
// Deprecated alpha-less version of WebPIDecGetYUVA(): it will ignore the
// alpha information (if present). Kept for backward compatibility.
static WEBP_INLINE uint8_t* WebPIDecGetYUV(
const WebPIDecoder* idec, int* last_y, uint8_t** u, uint8_t** v,
int* width, int* height, int* stride, int* uv_stride) {
return WebPIDecGetYUVA(idec, last_y, u, v, NULL, width, height,
stride, uv_stride, NULL);
}
// Generic call to retrieve information about the displayable area.
// If non NULL, the left/right/width/height pointers are filled with the visible
// rectangular area so far.
// Returns NULL in case the incremental decoder object is in an invalid state.
// Otherwise returns the pointer to the internal representation. This structure
// is read-only, tied to WebPIDecoder's lifespan and should not be modified.
WEBP_EXTERN const WebPDecBuffer* WebPIDecodedArea(
const WebPIDecoder* idec, int* left, int* top, int* width, int* height);
//------------------------------------------------------------------------------
// Advanced decoding parametrization
//
// Code sample for using the advanced decoding API
/*
// 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', if needed
config.no_fancy_upsampling = 1;
config.output.colorspace = MODE_BGRA;
// etc.
// Note that you can also make config.output point to an externally
// supplied memory buffer, provided it's big enough to store the decoded
// picture. Otherwise, config.output will just be used to allocate memory
// and store the decoded picture.
// D) Decode!
CHECK(WebPDecode(data, data_size, &config) == VP8_STATUS_OK);
// E) Decoded image is now in config.output (and config.output.u.RGBA)
// F) 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);
*/
// Features gathered from the bitstream
struct WebPBitstreamFeatures {
int width; // Width in pixels, as read from the bitstream.
int height; // Height in pixels, as read from the bitstream.
int has_alpha; // True if the bitstream contains an alpha channel.
int has_animation; // True if the bitstream is an animation.
int format; // 0 = undefined (/mixed), 1 = lossy, 2 = lossless
uint32_t pad[5]; // padding for later use
};
// Internal, version-checked, entry point
WEBP_EXTERN VP8StatusCode WebPGetFeaturesInternal(
const uint8_t*, size_t, WebPBitstreamFeatures*, int);
// Retrieve features from the bitstream. The *features structure is filled
// with information gathered from the bitstream.
// Returns VP8_STATUS_OK when the features are successfully retrieved. Returns
// VP8_STATUS_NOT_ENOUGH_DATA when more data is needed to retrieve the
// features from headers. Returns error in other cases.
// Note: The following chunk sequences (before the raw VP8/VP8L data) are
// considered valid by this function:
// RIFF + VP8(L)
// RIFF + VP8X + (optional chunks) + VP8(L)
// ALPH + VP8 <-- Not a valid WebP format: only allowed for internal purpose.
// VP8(L) <-- Not a valid WebP format: only allowed for internal purpose.
static WEBP_INLINE VP8StatusCode WebPGetFeatures(
const uint8_t* data, size_t data_size,
WebPBitstreamFeatures* features) {
return WebPGetFeaturesInternal(data, data_size, features,
WEBP_DECODER_ABI_VERSION);
}
// Decoding options
struct WebPDecoderOptions {
int bypass_filtering; // if true, skip the in-loop filtering
int no_fancy_upsampling; // if true, use faster pointwise upsampler
int use_cropping; // if true, cropping is applied _first_
int crop_left, crop_top; // top-left position for cropping.
// Will be snapped to even values.
int crop_width, crop_height; // dimension of the cropping area
int use_scaling; // if true, scaling is applied _afterward_
int scaled_width, scaled_height; // final resolution
int use_threads; // if true, use multi-threaded decoding
int dithering_strength; // dithering strength (0=Off, 100=full)
int flip; // if true, flip output vertically
int alpha_dithering_strength; // alpha dithering strength in [0..100]
uint32_t pad[5]; // padding for later use
};
// Main object storing the configuration for advanced decoding.
struct WebPDecoderConfig {
WebPBitstreamFeatures input; // Immutable bitstream features (optional)
WebPDecBuffer output; // Output buffer (can point to external mem)
WebPDecoderOptions options; // Decoding options
};
// Internal, version-checked, entry point
WEBP_EXTERN int WebPInitDecoderConfigInternal(WebPDecoderConfig*, int);
// Initialize the configuration as empty. This function must always be
// called first, unless WebPGetFeatures() is to be called.
// Returns false in case of mismatched version.
static WEBP_INLINE int WebPInitDecoderConfig(WebPDecoderConfig* config) {
return WebPInitDecoderConfigInternal(config, WEBP_DECODER_ABI_VERSION);
}
// Instantiate a new incremental decoder object with the requested
// configuration. The bitstream can be passed using 'data' and 'data_size'
// parameter, in which case the features will be parsed and stored into
// config->input. Otherwise, 'data' can be NULL and no parsing will occur.
// Note that 'config' can be NULL too, in which case a default configuration
// is used. If 'config' is not NULL, it must outlive the WebPIDecoder object
// as some references to its fields will be used. No internal copy of 'config'
// is made.
// The return WebPIDecoder object must always be deleted calling WebPIDelete().
// Returns NULL in case of error (and config->status will then reflect
// the error condition, if available).
WEBP_EXTERN WebPIDecoder* WebPIDecode(const uint8_t* data, size_t data_size,
WebPDecoderConfig* config);
// Non-incremental version. This version decodes the full data at once, taking
// 'config' into account. Returns decoding status (which should be VP8_STATUS_OK
// if the decoding was successful). Note that 'config' cannot be NULL.
WEBP_EXTERN VP8StatusCode WebPDecode(const uint8_t* data, size_t data_size,
WebPDecoderConfig* config);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // WEBP_WEBP_DECODE_H_
@@ -0,0 +1,363 @@
// Copyright 2012 Google Inc. All Rights Reserved.
//
// Use of this source code is governed by a BSD-style license
// that can be found in the COPYING file in the root of the source
// tree. An additional intellectual property rights grant can be found
// in the file PATENTS. All contributing project authors may
// be found in the AUTHORS file in the root of the source tree.
// -----------------------------------------------------------------------------
//
// Demux API.
// Enables extraction of image and extended format data from WebP files.
// Code Example: Demuxing WebP data to extract all the frames, ICC profile
// and EXIF/XMP metadata.
/*
WebPDemuxer* demux = WebPDemux(&webp_data);
uint32_t width = WebPDemuxGetI(demux, WEBP_FF_CANVAS_WIDTH);
uint32_t height = WebPDemuxGetI(demux, WEBP_FF_CANVAS_HEIGHT);
// ... (Get information about the features present in the WebP file).
uint32_t flags = WebPDemuxGetI(demux, WEBP_FF_FORMAT_FLAGS);
// ... (Iterate over all frames).
WebPIterator iter;
if (WebPDemuxGetFrame(demux, 1, &iter)) {
do {
// ... (Consume 'iter'; e.g. Decode 'iter.fragment' with WebPDecode(),
// ... and get other frame properties like width, height, offsets etc.
// ... see 'struct WebPIterator' below for more info).
} while (WebPDemuxNextFrame(&iter));
WebPDemuxReleaseIterator(&iter);
}
// ... (Extract metadata).
WebPChunkIterator chunk_iter;
if (flags & ICCP_FLAG) WebPDemuxGetChunk(demux, "ICCP", 1, &chunk_iter);
// ... (Consume the ICC profile in 'chunk_iter.chunk').
WebPDemuxReleaseChunkIterator(&chunk_iter);
if (flags & EXIF_FLAG) WebPDemuxGetChunk(demux, "EXIF", 1, &chunk_iter);
// ... (Consume the EXIF metadata in 'chunk_iter.chunk').
WebPDemuxReleaseChunkIterator(&chunk_iter);
if (flags & XMP_FLAG) WebPDemuxGetChunk(demux, "XMP ", 1, &chunk_iter);
// ... (Consume the XMP metadata in 'chunk_iter.chunk').
WebPDemuxReleaseChunkIterator(&chunk_iter);
WebPDemuxDelete(demux);
*/
#ifndef WEBP_WEBP_DEMUX_H_
#define WEBP_WEBP_DEMUX_H_
#include "./decode.h" // for WEBP_CSP_MODE
#include "./mux_types.h"
#ifdef __cplusplus
extern "C" {
#endif
#define WEBP_DEMUX_ABI_VERSION 0x0107 // MAJOR(8b) + MINOR(8b)
// Note: forward declaring enumerations is not allowed in (strict) C and C++,
// the types are left here for reference.
// typedef enum WebPDemuxState WebPDemuxState;
// typedef enum WebPFormatFeature WebPFormatFeature;
typedef struct WebPDemuxer WebPDemuxer;
typedef struct WebPIterator WebPIterator;
typedef struct WebPChunkIterator WebPChunkIterator;
typedef struct WebPAnimInfo WebPAnimInfo;
typedef struct WebPAnimDecoderOptions WebPAnimDecoderOptions;
//------------------------------------------------------------------------------
// Returns the version number of the demux library, packed in hexadecimal using
// 8bits for each of major/minor/revision. E.g: v2.5.7 is 0x020507.
WEBP_EXTERN int WebPGetDemuxVersion(void);
//------------------------------------------------------------------------------
// Life of a Demux object
typedef enum WebPDemuxState {
WEBP_DEMUX_PARSE_ERROR = -1, // An error occurred while parsing.
WEBP_DEMUX_PARSING_HEADER = 0, // Not enough data to parse full header.
WEBP_DEMUX_PARSED_HEADER = 1, // Header parsing complete,
// data may be available.
WEBP_DEMUX_DONE = 2 // Entire file has been parsed.
} WebPDemuxState;
// Internal, version-checked, entry point
WEBP_EXTERN WebPDemuxer* WebPDemuxInternal(
const WebPData*, int, WebPDemuxState*, int);
// Parses the full WebP file given by 'data'. For single images the WebP file
// header alone or the file header and the chunk header may be absent.
// Returns a WebPDemuxer object on successful parse, NULL otherwise.
static WEBP_INLINE WebPDemuxer* WebPDemux(const WebPData* data) {
return WebPDemuxInternal(data, 0, NULL, WEBP_DEMUX_ABI_VERSION);
}
// Parses the possibly incomplete WebP file given by 'data'.
// If 'state' is non-NULL it will be set to indicate the status of the demuxer.
// Returns NULL in case of error or if there isn't enough data to start parsing;
// and a WebPDemuxer object on successful parse.
// Note that WebPDemuxer keeps internal pointers to 'data' memory segment.
// If this data is volatile, the demuxer object should be deleted (by calling
// WebPDemuxDelete()) and WebPDemuxPartial() called again on the new data.
// This is usually an inexpensive operation.
static WEBP_INLINE WebPDemuxer* WebPDemuxPartial(
const WebPData* data, WebPDemuxState* state) {
return WebPDemuxInternal(data, 1, state, WEBP_DEMUX_ABI_VERSION);
}
// Frees memory associated with 'dmux'.
WEBP_EXTERN void WebPDemuxDelete(WebPDemuxer* dmux);
//------------------------------------------------------------------------------
// Data/information extraction.
typedef enum WebPFormatFeature {
WEBP_FF_FORMAT_FLAGS, // bit-wise combination of WebPFeatureFlags
// corresponding to the 'VP8X' chunk (if present).
WEBP_FF_CANVAS_WIDTH,
WEBP_FF_CANVAS_HEIGHT,
WEBP_FF_LOOP_COUNT, // only relevant for animated file
WEBP_FF_BACKGROUND_COLOR, // idem.
WEBP_FF_FRAME_COUNT // Number of frames present in the demux object.
// In case of a partial demux, this is the number
// of frames seen so far, with the last frame
// possibly being partial.
} WebPFormatFeature;
// Get the 'feature' value from the 'dmux'.
// NOTE: values are only valid if WebPDemux() was used or WebPDemuxPartial()
// returned a state > WEBP_DEMUX_PARSING_HEADER.
// If 'feature' is WEBP_FF_FORMAT_FLAGS, the returned value is a bit-wise
// combination of WebPFeatureFlags values.
// If 'feature' is WEBP_FF_LOOP_COUNT, WEBP_FF_BACKGROUND_COLOR, the returned
// value is only meaningful if the bitstream is animated.
WEBP_EXTERN uint32_t WebPDemuxGetI(
const WebPDemuxer* dmux, WebPFormatFeature feature);
//------------------------------------------------------------------------------
// Frame iteration.
struct WebPIterator {
int frame_num;
int num_frames; // equivalent to WEBP_FF_FRAME_COUNT.
int x_offset, y_offset; // offset relative to the canvas.
int width, height; // dimensions of this frame.
int duration; // display duration in milliseconds.
WebPMuxAnimDispose dispose_method; // dispose method for the frame.
int complete; // true if 'fragment' contains a full frame. partial images
// may still be decoded with the WebP incremental decoder.
WebPData fragment; // The frame given by 'frame_num'. Note for historical
// reasons this is called a fragment.
int has_alpha; // True if the frame contains transparency.
WebPMuxAnimBlend blend_method; // Blend operation for the frame.
uint32_t pad[2]; // padding for later use.
void* private_; // for internal use only.
};
// Retrieves frame 'frame_number' from 'dmux'.
// 'iter->fragment' points to the frame on return from this function.
// Setting 'frame_number' equal to 0 will return the last frame of the image.
// Returns false if 'dmux' is NULL or frame 'frame_number' is not present.
// Call WebPDemuxReleaseIterator() when use of the iterator is complete.
// NOTE: 'dmux' must persist for the lifetime of 'iter'.
WEBP_EXTERN int WebPDemuxGetFrame(
const WebPDemuxer* dmux, int frame_number, WebPIterator* iter);
// Sets 'iter->fragment' to point to the next ('iter->frame_num' + 1) or
// previous ('iter->frame_num' - 1) frame. These functions do not loop.
// Returns true on success, false otherwise.
WEBP_EXTERN int WebPDemuxNextFrame(WebPIterator* iter);
WEBP_EXTERN int WebPDemuxPrevFrame(WebPIterator* iter);
// Releases any memory associated with 'iter'.
// Must be called before any subsequent calls to WebPDemuxGetChunk() on the same
// iter. Also, must be called before destroying the associated WebPDemuxer with
// WebPDemuxDelete().
WEBP_EXTERN void WebPDemuxReleaseIterator(WebPIterator* iter);
//------------------------------------------------------------------------------
// Chunk iteration.
struct WebPChunkIterator {
// The current and total number of chunks with the fourcc given to
// WebPDemuxGetChunk().
int chunk_num;
int num_chunks;
WebPData chunk; // The payload of the chunk.
uint32_t pad[6]; // padding for later use
void* private_;
};
// Retrieves the 'chunk_number' instance of the chunk with id 'fourcc' from
// 'dmux'.
// 'fourcc' is a character array containing the fourcc of the chunk to return,
// e.g., "ICCP", "XMP ", "EXIF", etc.
// Setting 'chunk_number' equal to 0 will return the last chunk in a set.
// Returns true if the chunk is found, false otherwise. Image related chunk
// payloads are accessed through WebPDemuxGetFrame() and related functions.
// Call WebPDemuxReleaseChunkIterator() when use of the iterator is complete.
// NOTE: 'dmux' must persist for the lifetime of the iterator.
WEBP_EXTERN int WebPDemuxGetChunk(const WebPDemuxer* dmux,
const char fourcc[4], int chunk_number,
WebPChunkIterator* iter);
// Sets 'iter->chunk' to point to the next ('iter->chunk_num' + 1) or previous
// ('iter->chunk_num' - 1) chunk. These functions do not loop.
// Returns true on success, false otherwise.
WEBP_EXTERN int WebPDemuxNextChunk(WebPChunkIterator* iter);
WEBP_EXTERN int WebPDemuxPrevChunk(WebPChunkIterator* iter);
// Releases any memory associated with 'iter'.
// Must be called before destroying the associated WebPDemuxer with
// WebPDemuxDelete().
WEBP_EXTERN void WebPDemuxReleaseChunkIterator(WebPChunkIterator* iter);
//------------------------------------------------------------------------------
// WebPAnimDecoder API
//
// This API allows decoding (possibly) animated WebP images.
//
// Code Example:
/*
WebPAnimDecoderOptions dec_options;
WebPAnimDecoderOptionsInit(&dec_options);
// Tune 'dec_options' as needed.
WebPAnimDecoder* dec = WebPAnimDecoderNew(webp_data, &dec_options);
WebPAnimInfo anim_info;
WebPAnimDecoderGetInfo(dec, &anim_info);
for (uint32_t i = 0; i < anim_info.loop_count; ++i) {
while (WebPAnimDecoderHasMoreFrames(dec)) {
uint8_t* buf;
int timestamp;
WebPAnimDecoderGetNext(dec, &buf, &timestamp);
// ... (Render 'buf' based on 'timestamp').
// ... (Do NOT free 'buf', as it is owned by 'dec').
}
WebPAnimDecoderReset(dec);
}
const WebPDemuxer* demuxer = WebPAnimDecoderGetDemuxer(dec);
// ... (Do something using 'demuxer'; e.g. get EXIF/XMP/ICC data).
WebPAnimDecoderDelete(dec);
*/
typedef struct WebPAnimDecoder WebPAnimDecoder; // Main opaque object.
// Global options.
struct WebPAnimDecoderOptions {
// Output colorspace. Only the following modes are supported:
// MODE_RGBA, MODE_BGRA, MODE_rgbA and MODE_bgrA.
WEBP_CSP_MODE color_mode;
int use_threads; // If true, use multi-threaded decoding.
uint32_t padding[7]; // Padding for later use.
};
// Internal, version-checked, entry point.
WEBP_EXTERN int WebPAnimDecoderOptionsInitInternal(
WebPAnimDecoderOptions*, int);
// Should always be called, to initialize a fresh WebPAnimDecoderOptions
// structure before modification. Returns false in case of version mismatch.
// WebPAnimDecoderOptionsInit() must have succeeded before using the
// 'dec_options' object.
static WEBP_INLINE int WebPAnimDecoderOptionsInit(
WebPAnimDecoderOptions* dec_options) {
return WebPAnimDecoderOptionsInitInternal(dec_options,
WEBP_DEMUX_ABI_VERSION);
}
// Internal, version-checked, entry point.
WEBP_EXTERN WebPAnimDecoder* WebPAnimDecoderNewInternal(
const WebPData*, const WebPAnimDecoderOptions*, int);
// Creates and initializes a WebPAnimDecoder object.
// Parameters:
// webp_data - (in) WebP bitstream. This should remain unchanged during the
// lifetime of the output WebPAnimDecoder object.
// dec_options - (in) decoding options. Can be passed NULL to choose
// reasonable defaults (in particular, color mode MODE_RGBA
// will be picked).
// Returns:
// A pointer to the newly created WebPAnimDecoder object, or NULL in case of
// parsing error, invalid option or memory error.
static WEBP_INLINE WebPAnimDecoder* WebPAnimDecoderNew(
const WebPData* webp_data, const WebPAnimDecoderOptions* dec_options) {
return WebPAnimDecoderNewInternal(webp_data, dec_options,
WEBP_DEMUX_ABI_VERSION);
}
// Global information about the animation..
struct WebPAnimInfo {
uint32_t canvas_width;
uint32_t canvas_height;
uint32_t loop_count;
uint32_t bgcolor;
uint32_t frame_count;
uint32_t pad[4]; // padding for later use
};
// Get global information about the animation.
// Parameters:
// dec - (in) decoder instance to get information from.
// info - (out) global information fetched from the animation.
// Returns:
// True on success.
WEBP_EXTERN int WebPAnimDecoderGetInfo(const WebPAnimDecoder* dec,
WebPAnimInfo* info);
// Fetch the next frame from 'dec' based on options supplied to
// WebPAnimDecoderNew(). This will be a fully reconstructed canvas of size
// 'canvas_width * 4 * canvas_height', and not just the frame sub-rectangle. The
// returned buffer 'buf' is valid only until the next call to
// WebPAnimDecoderGetNext(), WebPAnimDecoderReset() or WebPAnimDecoderDelete().
// Parameters:
// dec - (in/out) decoder instance from which the next frame is to be fetched.
// buf - (out) decoded frame.
// timestamp - (out) timestamp of the frame in milliseconds.
// Returns:
// False if any of the arguments are NULL, or if there is a parsing or
// decoding error, or if there are no more frames. Otherwise, returns true.
WEBP_EXTERN int WebPAnimDecoderGetNext(WebPAnimDecoder* dec,
uint8_t** buf, int* timestamp);
// Check if there are more frames left to decode.
// Parameters:
// dec - (in) decoder instance to be checked.
// Returns:
// True if 'dec' is not NULL and some frames are yet to be decoded.
// Otherwise, returns false.
WEBP_EXTERN int WebPAnimDecoderHasMoreFrames(const WebPAnimDecoder* dec);
// Resets the WebPAnimDecoder object, so that next call to
// WebPAnimDecoderGetNext() will restart decoding from 1st frame. This would be
// helpful when all frames need to be decoded multiple times (e.g.
// info.loop_count times) without destroying and recreating the 'dec' object.
// Parameters:
// dec - (in/out) decoder instance to be reset
WEBP_EXTERN void WebPAnimDecoderReset(WebPAnimDecoder* dec);
// Grab the internal demuxer object.
// Getting the demuxer object can be useful if one wants to use operations only
// available through demuxer; e.g. to get XMP/EXIF/ICC metadata. The returned
// demuxer object is owned by 'dec' and is valid only until the next call to
// WebPAnimDecoderDelete().
//
// Parameters:
// dec - (in) decoder instance from which the demuxer object is to be fetched.
WEBP_EXTERN const WebPDemuxer* WebPAnimDecoderGetDemuxer(
const WebPAnimDecoder* dec);
// Deletes the WebPAnimDecoder object.
// Parameters:
// dec - (in/out) decoder instance to be deleted
WEBP_EXTERN void WebPAnimDecoderDelete(WebPAnimDecoder* dec);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // WEBP_WEBP_DEMUX_H_
@@ -0,0 +1,552 @@
// Copyright 2011 Google Inc. All Rights Reserved.
//
// Use of this source code is governed by a BSD-style license
// that can be found in the COPYING file in the root of the source
// tree. An additional intellectual property rights grant can be found
// in the file PATENTS. All contributing project authors may
// be found in the AUTHORS file in the root of the source tree.
// -----------------------------------------------------------------------------
//
// WebP encoder: main interface
//
// Author: Skal (pascal.massimino@gmail.com)
#ifndef WEBP_WEBP_ENCODE_H_
#define WEBP_WEBP_ENCODE_H_
#include "./types.h"
#ifdef __cplusplus
extern "C" {
#endif
#define WEBP_ENCODER_ABI_VERSION 0x020f // MAJOR(8b) + MINOR(8b)
// Note: forward declaring enumerations is not allowed in (strict) C and C++,
// the types are left here for reference.
// typedef enum WebPImageHint WebPImageHint;
// typedef enum WebPEncCSP WebPEncCSP;
// typedef enum WebPPreset WebPPreset;
// typedef enum WebPEncodingError WebPEncodingError;
typedef struct WebPConfig WebPConfig;
typedef struct WebPPicture WebPPicture; // main structure for I/O
typedef struct WebPAuxStats WebPAuxStats;
typedef struct WebPMemoryWriter WebPMemoryWriter;
// Return the encoder's version number, packed in hexadecimal using 8bits for
// each of major/minor/revision. E.g: v2.5.7 is 0x020507.
WEBP_EXTERN int WebPGetEncoderVersion(void);
//------------------------------------------------------------------------------
// One-stop-shop call! No questions asked:
// Returns the size of the compressed data (pointed to by *output), or 0 if
// an error occurred. The compressed data must be released by the caller
// using the call 'WebPFree(*output)'.
// These functions compress using the lossy format, and the quality_factor
// can go from 0 (smaller output, lower quality) to 100 (best quality,
// larger output).
WEBP_EXTERN size_t WebPEncodeRGB(const uint8_t* rgb,
int width, int height, int stride,
float quality_factor, uint8_t** output);
WEBP_EXTERN size_t WebPEncodeBGR(const uint8_t* bgr,
int width, int height, int stride,
float quality_factor, uint8_t** output);
WEBP_EXTERN size_t WebPEncodeRGBA(const uint8_t* rgba,
int width, int height, int stride,
float quality_factor, uint8_t** output);
WEBP_EXTERN size_t WebPEncodeBGRA(const uint8_t* bgra,
int width, int height, int stride,
float quality_factor, uint8_t** output);
// These functions are the equivalent of the above, but compressing in a
// lossless manner. Files are usually larger than lossy format, but will
// not suffer any compression loss.
// Note these functions, like the lossy versions, use the library's default
// settings. For lossless this means 'exact' is disabled. RGB values in
// transparent areas will be modified to improve compression. To avoid this,
// use WebPEncode() and set WebPConfig::exact to 1.
WEBP_EXTERN size_t WebPEncodeLosslessRGB(const uint8_t* rgb,
int width, int height, int stride,
uint8_t** output);
WEBP_EXTERN size_t WebPEncodeLosslessBGR(const uint8_t* bgr,
int width, int height, int stride,
uint8_t** output);
WEBP_EXTERN size_t WebPEncodeLosslessRGBA(const uint8_t* rgba,
int width, int height, int stride,
uint8_t** output);
WEBP_EXTERN size_t WebPEncodeLosslessBGRA(const uint8_t* bgra,
int width, int height, int stride,
uint8_t** output);
//------------------------------------------------------------------------------
// Coding parameters
// Image characteristics hint for the underlying encoder.
typedef enum WebPImageHint {
WEBP_HINT_DEFAULT = 0, // default preset.
WEBP_HINT_PICTURE, // digital picture, like portrait, inner shot
WEBP_HINT_PHOTO, // outdoor photograph, with natural lighting
WEBP_HINT_GRAPH, // Discrete tone image (graph, map-tile etc).
WEBP_HINT_LAST
} WebPImageHint;
// Compression parameters.
struct WebPConfig {
int lossless; // Lossless encoding (0=lossy(default), 1=lossless).
float quality; // between 0 and 100. For lossy, 0 gives the smallest
// size and 100 the largest. For lossless, this
// parameter is the amount of effort put into the
// compression: 0 is the fastest but gives larger
// files compared to the slowest, but best, 100.
int method; // quality/speed trade-off (0=fast, 6=slower-better)
WebPImageHint image_hint; // Hint for image type (lossless only for now).
int target_size; // if non-zero, set the desired target size in bytes.
// Takes precedence over the 'compression' parameter.
float target_PSNR; // if non-zero, specifies the minimal distortion to
// try to achieve. Takes precedence over target_size.
int segments; // maximum number of segments to use, in [1..4]
int sns_strength; // Spatial Noise Shaping. 0=off, 100=maximum.
int filter_strength; // range: [0 = off .. 100 = strongest]
int filter_sharpness; // range: [0 = off .. 7 = least sharp]
int filter_type; // filtering type: 0 = simple, 1 = strong (only used
// if filter_strength > 0 or autofilter > 0)
int autofilter; // Auto adjust filter's strength [0 = off, 1 = on]
int alpha_compression; // Algorithm for encoding the alpha plane (0 = none,
// 1 = compressed with WebP lossless). Default is 1.
int alpha_filtering; // Predictive filtering method for alpha plane.
// 0: none, 1: fast, 2: best. Default if 1.
int alpha_quality; // Between 0 (smallest size) and 100 (lossless).
// Default is 100.
int pass; // number of entropy-analysis passes (in [1..10]).
int show_compressed; // if true, export the compressed picture back.
// In-loop filtering is not applied.
int preprocessing; // preprocessing filter:
// 0=none, 1=segment-smooth, 2=pseudo-random dithering
int partitions; // log2(number of token partitions) in [0..3]. Default
// is set to 0 for easier progressive decoding.
int partition_limit; // quality degradation allowed to fit the 512k limit
// on prediction modes coding (0: no degradation,
// 100: maximum possible degradation).
int emulate_jpeg_size; // If true, compression parameters will be remapped
// to better match the expected output size from
// JPEG compression. Generally, the output size will
// be similar but the degradation will be lower.
int thread_level; // If non-zero, try and use multi-threaded encoding.
int low_memory; // If set, reduce memory usage (but increase CPU use).
int near_lossless; // Near lossless encoding [0 = max loss .. 100 = off
// (default)].
int exact; // if non-zero, preserve the exact RGB values under
// transparent area. Otherwise, discard this invisible
// RGB information for better compression. The default
// value is 0.
int use_delta_palette; // reserved for future lossless feature
int use_sharp_yuv; // if needed, use sharp (and slow) RGB->YUV conversion
int qmin; // minimum permissible quality factor
int qmax; // maximum permissible quality factor
};
// Enumerate some predefined settings for WebPConfig, depending on the type
// of source picture. These presets are used when calling WebPConfigPreset().
typedef enum WebPPreset {
WEBP_PRESET_DEFAULT = 0, // default preset.
WEBP_PRESET_PICTURE, // digital picture, like portrait, inner shot
WEBP_PRESET_PHOTO, // outdoor photograph, with natural lighting
WEBP_PRESET_DRAWING, // hand or line drawing, with high-contrast details
WEBP_PRESET_ICON, // small-sized colorful images
WEBP_PRESET_TEXT // text-like
} WebPPreset;
// Internal, version-checked, entry point
WEBP_EXTERN int WebPConfigInitInternal(WebPConfig*, WebPPreset, float, int);
// Should always be called, to initialize a fresh WebPConfig structure before
// modification. Returns false in case of version mismatch. WebPConfigInit()
// must have succeeded before using the 'config' object.
// Note that the default values are lossless=0 and quality=75.
static WEBP_INLINE int WebPConfigInit(WebPConfig* config) {
return WebPConfigInitInternal(config, WEBP_PRESET_DEFAULT, 75.f,
WEBP_ENCODER_ABI_VERSION);
}
// This function will initialize the configuration according to a predefined
// set of parameters (referred to by 'preset') and a given quality factor.
// This function can be called as a replacement to WebPConfigInit(). Will
// return false in case of error.
static WEBP_INLINE int WebPConfigPreset(WebPConfig* config,
WebPPreset preset, float quality) {
return WebPConfigInitInternal(config, preset, quality,
WEBP_ENCODER_ABI_VERSION);
}
// Activate the lossless compression mode with the desired efficiency level
// between 0 (fastest, lowest compression) and 9 (slower, best compression).
// A good default level is '6', providing a fair tradeoff between compression
// speed and final compressed size.
// This function will overwrite several fields from config: 'method', 'quality'
// and 'lossless'. Returns false in case of parameter error.
WEBP_EXTERN int WebPConfigLosslessPreset(WebPConfig* config, int level);
// Returns true if 'config' is non-NULL and all configuration parameters are
// within their valid ranges.
WEBP_EXTERN int WebPValidateConfig(const WebPConfig* config);
//------------------------------------------------------------------------------
// Input / Output
// Structure for storing auxiliary statistics.
struct WebPAuxStats {
int coded_size; // final size
float PSNR[5]; // peak-signal-to-noise ratio for Y/U/V/All/Alpha
int block_count[3]; // number of intra4/intra16/skipped macroblocks
int header_bytes[2]; // approximate number of bytes spent for header
// and mode-partition #0
int residual_bytes[3][4]; // approximate number of bytes spent for
// DC/AC/uv coefficients for each (0..3) segments.
int segment_size[4]; // number of macroblocks in each segments
int segment_quant[4]; // quantizer values for each segments
int segment_level[4]; // filtering strength for each segments [0..63]
int alpha_data_size; // size of the transparency data
int layer_data_size; // size of the enhancement layer data
// lossless encoder statistics
uint32_t lossless_features; // bit0:predictor bit1:cross-color transform
// bit2:subtract-green bit3:color indexing
int histogram_bits; // number of precision bits of histogram
int transform_bits; // precision bits for transform
int cache_bits; // number of bits for color cache lookup
int palette_size; // number of color in palette, if used
int lossless_size; // final lossless size
int lossless_hdr_size; // lossless header (transform, huffman etc) size
int lossless_data_size; // lossless image data size
uint32_t pad[2]; // padding for later use
};
// Signature for output function. Should return true if writing was successful.
// data/data_size is the segment of data to write, and 'picture' is for
// reference (and so one can make use of picture->custom_ptr).
typedef int (*WebPWriterFunction)(const uint8_t* data, size_t data_size,
const WebPPicture* picture);
// WebPMemoryWrite: a special WebPWriterFunction that writes to memory using
// the following WebPMemoryWriter object (to be set as a custom_ptr).
struct WebPMemoryWriter {
uint8_t* mem; // final buffer (of size 'max_size', larger than 'size').
size_t size; // final size
size_t max_size; // total capacity
uint32_t pad[1]; // padding for later use
};
// The following must be called first before any use.
WEBP_EXTERN void WebPMemoryWriterInit(WebPMemoryWriter* writer);
// The following must be called to deallocate writer->mem memory. The 'writer'
// object itself is not deallocated.
WEBP_EXTERN void WebPMemoryWriterClear(WebPMemoryWriter* writer);
// The custom writer to be used with WebPMemoryWriter as custom_ptr. Upon
// completion, writer.mem and writer.size will hold the coded data.
// writer.mem must be freed by calling WebPMemoryWriterClear.
WEBP_EXTERN int WebPMemoryWrite(const uint8_t* data, size_t data_size,
const WebPPicture* picture);
// Progress hook, called from time to time to report progress. It can return
// false to request an abort of the encoding process, or true otherwise if
// everything is OK.
typedef int (*WebPProgressHook)(int percent, const WebPPicture* picture);
// Color spaces.
typedef enum WebPEncCSP {
// chroma sampling
WEBP_YUV420 = 0, // 4:2:0
WEBP_YUV420A = 4, // alpha channel variant
WEBP_CSP_UV_MASK = 3, // bit-mask to get the UV sampling factors
WEBP_CSP_ALPHA_BIT = 4 // bit that is set if alpha is present
} WebPEncCSP;
// Encoding error conditions.
typedef enum WebPEncodingError {
VP8_ENC_OK = 0,
VP8_ENC_ERROR_OUT_OF_MEMORY, // memory error allocating objects
VP8_ENC_ERROR_BITSTREAM_OUT_OF_MEMORY, // memory error while flushing bits
VP8_ENC_ERROR_NULL_PARAMETER, // a pointer parameter is NULL
VP8_ENC_ERROR_INVALID_CONFIGURATION, // configuration is invalid
VP8_ENC_ERROR_BAD_DIMENSION, // picture has invalid width/height
VP8_ENC_ERROR_PARTITION0_OVERFLOW, // partition is bigger than 512k
VP8_ENC_ERROR_PARTITION_OVERFLOW, // partition is bigger than 16M
VP8_ENC_ERROR_BAD_WRITE, // error while flushing bytes
VP8_ENC_ERROR_FILE_TOO_BIG, // file is bigger than 4G
VP8_ENC_ERROR_USER_ABORT, // abort request by user
VP8_ENC_ERROR_LAST // list terminator. always last.
} WebPEncodingError;
// maximum width/height allowed (inclusive), in pixels
#define WEBP_MAX_DIMENSION 16383
// Main exchange structure (input samples, output bytes, statistics)
//
// Once WebPPictureInit() has been called, it's ok to make all the INPUT fields
// (use_argb, y/u/v, argb, ...) point to user-owned data, even if
// WebPPictureAlloc() has been called. Depending on the value use_argb,
// it's guaranteed that either *argb or *y/*u/*v content will be kept untouched.
struct WebPPicture {
// INPUT
//////////////
// Main flag for encoder selecting between ARGB or YUV input.
// It is recommended to use ARGB input (*argb, argb_stride) for lossless
// compression, and YUV input (*y, *u, *v, etc.) for lossy compression
// since these are the respective native colorspace for these formats.
int use_argb;
// YUV input (mostly used for input to lossy compression)
WebPEncCSP colorspace; // colorspace: should be YUV420 for now (=Y'CbCr).
int width, height; // dimensions (less or equal to WEBP_MAX_DIMENSION)
uint8_t* y, *u, *v; // pointers to luma/chroma planes.
int y_stride, uv_stride; // luma/chroma strides.
uint8_t* a; // pointer to the alpha plane
int a_stride; // stride of the alpha plane
uint32_t pad1[2]; // padding for later use
// ARGB input (mostly used for input to lossless compression)
uint32_t* argb; // Pointer to argb (32 bit) plane.
int argb_stride; // This is stride in pixels units, not bytes.
uint32_t pad2[3]; // padding for later use
// OUTPUT
///////////////
// Byte-emission hook, to store compressed bytes as they are ready.
WebPWriterFunction writer; // can be NULL
void* custom_ptr; // can be used by the writer.
// map for extra information (only for lossy compression mode)
int extra_info_type; // 1: intra type, 2: segment, 3: quant
// 4: intra-16 prediction mode,
// 5: chroma prediction mode,
// 6: bit cost, 7: distortion
uint8_t* extra_info; // if not NULL, points to an array of size
// ((width + 15) / 16) * ((height + 15) / 16) that
// will be filled with a macroblock map, depending
// on extra_info_type.
// STATS AND REPORTS
///////////////////////////
// Pointer to side statistics (updated only if not NULL)
WebPAuxStats* stats;
// Error code for the latest error encountered during encoding
WebPEncodingError error_code;
// If not NULL, report progress during encoding.
WebPProgressHook progress_hook;
void* user_data; // this field is free to be set to any value and
// used during callbacks (like progress-report e.g.).
uint32_t pad3[3]; // padding for later use
// Unused for now
uint8_t* pad4, *pad5;
uint32_t pad6[8]; // padding for later use
// PRIVATE FIELDS
////////////////////
void* memory_; // row chunk of memory for yuva planes
void* memory_argb_; // and for argb too.
void* pad7[2]; // padding for later use
};
// Internal, version-checked, entry point
WEBP_EXTERN int WebPPictureInitInternal(WebPPicture*, int);
// Should always be called, to initialize the structure. Returns false in case
// of version mismatch. WebPPictureInit() must have succeeded before using the
// 'picture' object.
// Note that, by default, use_argb is false and colorspace is WEBP_YUV420.
static WEBP_INLINE int WebPPictureInit(WebPPicture* picture) {
return WebPPictureInitInternal(picture, WEBP_ENCODER_ABI_VERSION);
}
//------------------------------------------------------------------------------
// WebPPicture utils
// Convenience allocation / deallocation based on picture->width/height:
// Allocate y/u/v buffers as per colorspace/width/height specification.
// Note! This function will free the previous buffer if needed.
// Returns false in case of memory error.
WEBP_EXTERN int WebPPictureAlloc(WebPPicture* picture);
// Release the memory allocated by WebPPictureAlloc() or WebPPictureImport*().
// Note that this function does _not_ free the memory used by the 'picture'
// object itself.
// Besides memory (which is reclaimed) all other fields of 'picture' are
// preserved.
WEBP_EXTERN void WebPPictureFree(WebPPicture* picture);
// Copy the pixels of *src into *dst, using WebPPictureAlloc. Upon return, *dst
// will fully own the copied pixels (this is not a view). The 'dst' picture need
// not be initialized as its content is overwritten.
// Returns false in case of memory allocation error.
WEBP_EXTERN int WebPPictureCopy(const WebPPicture* src, WebPPicture* dst);
// Compute the single distortion for packed planes of samples.
// 'src' will be compared to 'ref', and the raw distortion stored into
// '*distortion'. The refined metric (log(MSE), log(1 - ssim),...' will be
// stored in '*result'.
// 'x_step' is the horizontal stride (in bytes) between samples.
// 'src/ref_stride' is the byte distance between rows.
// Returns false in case of error (bad parameter, memory allocation error, ...).
WEBP_EXTERN int WebPPlaneDistortion(const uint8_t* src, size_t src_stride,
const uint8_t* ref, size_t ref_stride,
int width, int height,
size_t x_step,
int type, // 0 = PSNR, 1 = SSIM, 2 = LSIM
float* distortion, float* result);
// Compute PSNR, SSIM or LSIM distortion metric between two pictures. Results
// are in dB, stored in result[] in the B/G/R/A/All order. The distortion is
// always performed using ARGB samples. Hence if the input is YUV(A), the
// picture will be internally converted to ARGB (just for the measurement).
// Warning: this function is rather CPU-intensive.
WEBP_EXTERN int WebPPictureDistortion(
const WebPPicture* src, const WebPPicture* ref,
int metric_type, // 0 = PSNR, 1 = SSIM, 2 = LSIM
float result[5]);
// self-crops a picture to the rectangle defined by top/left/width/height.
// Returns false in case of memory allocation error, or if the rectangle is
// outside of the source picture.
// The rectangle for the view is defined by the top-left corner pixel
// coordinates (left, top) as well as its width and height. This rectangle
// must be fully be comprised inside the 'src' source picture. If the source
// picture uses the YUV420 colorspace, the top and left coordinates will be
// snapped to even values.
WEBP_EXTERN int WebPPictureCrop(WebPPicture* picture,
int left, int top, int width, int height);
// Extracts a view from 'src' picture into 'dst'. The rectangle for the view
// is defined by the top-left corner pixel coordinates (left, top) as well
// as its width and height. This rectangle must be fully be comprised inside
// the 'src' source picture. If the source picture uses the YUV420 colorspace,
// the top and left coordinates will be snapped to even values.
// Picture 'src' must out-live 'dst' picture. Self-extraction of view is allowed
// ('src' equal to 'dst') as a mean of fast-cropping (but note that doing so,
// the original dimension will be lost). Picture 'dst' need not be initialized
// with WebPPictureInit() if it is different from 'src', since its content will
// be overwritten.
// Returns false in case of invalid parameters.
WEBP_EXTERN int WebPPictureView(const WebPPicture* src,
int left, int top, int width, int height,
WebPPicture* dst);
// Returns true if the 'picture' is actually a view and therefore does
// not own the memory for pixels.
WEBP_EXTERN int WebPPictureIsView(const WebPPicture* picture);
// Rescale a picture to new dimension width x height.
// If either 'width' or 'height' (but not both) is 0 the corresponding
// dimension will be calculated preserving the aspect ratio.
// No gamma correction is applied.
// Returns false in case of error (invalid parameter or insufficient memory).
WEBP_EXTERN int WebPPictureRescale(WebPPicture* picture, int width, int height);
// Colorspace conversion function to import RGB samples.
// Previous buffer will be free'd, if any.
// *rgb buffer should have a size of at least height * rgb_stride.
// Returns false in case of memory error.
WEBP_EXTERN int WebPPictureImportRGB(
WebPPicture* picture, const uint8_t* rgb, int rgb_stride);
// Same, but for RGBA buffer.
WEBP_EXTERN int WebPPictureImportRGBA(
WebPPicture* picture, const uint8_t* rgba, int rgba_stride);
// Same, but for RGBA buffer. Imports the RGB direct from the 32-bit format
// input buffer ignoring the alpha channel. Avoids needing to copy the data
// to a temporary 24-bit RGB buffer to import the RGB only.
WEBP_EXTERN int WebPPictureImportRGBX(
WebPPicture* picture, const uint8_t* rgbx, int rgbx_stride);
// Variants of the above, but taking BGR(A|X) input.
WEBP_EXTERN int WebPPictureImportBGR(
WebPPicture* picture, const uint8_t* bgr, int bgr_stride);
WEBP_EXTERN int WebPPictureImportBGRA(
WebPPicture* picture, const uint8_t* bgra, int bgra_stride);
WEBP_EXTERN int WebPPictureImportBGRX(
WebPPicture* picture, const uint8_t* bgrx, int bgrx_stride);
// Converts picture->argb data to the YUV420A format. The 'colorspace'
// parameter is deprecated and should be equal to WEBP_YUV420.
// Upon return, picture->use_argb is set to false. The presence of real
// non-opaque transparent values is detected, and 'colorspace' will be
// adjusted accordingly. Note that this method is lossy.
// Returns false in case of error.
WEBP_EXTERN int WebPPictureARGBToYUVA(WebPPicture* picture,
WebPEncCSP /*colorspace = WEBP_YUV420*/);
// Same as WebPPictureARGBToYUVA(), but the conversion is done using
// pseudo-random dithering with a strength 'dithering' between
// 0.0 (no dithering) and 1.0 (maximum dithering). This is useful
// for photographic picture.
WEBP_EXTERN int WebPPictureARGBToYUVADithered(
WebPPicture* picture, WebPEncCSP colorspace, float dithering);
// Performs 'sharp' RGBA->YUVA420 downsampling and colorspace conversion.
// Downsampling is handled with extra care in case of color clipping. This
// method is roughly 2x slower than WebPPictureARGBToYUVA() but produces better
// and sharper YUV representation.
// Returns false in case of error.
WEBP_EXTERN int WebPPictureSharpARGBToYUVA(WebPPicture* picture);
// kept for backward compatibility:
WEBP_EXTERN int WebPPictureSmartARGBToYUVA(WebPPicture* picture);
// Converts picture->yuv to picture->argb and sets picture->use_argb to true.
// The input format must be YUV_420 or YUV_420A. The conversion from YUV420 to
// ARGB incurs a small loss too.
// Note that the use of this colorspace is discouraged if one has access to the
// raw ARGB samples, since using YUV420 is comparatively lossy.
// Returns false in case of error.
WEBP_EXTERN int WebPPictureYUVAToARGB(WebPPicture* picture);
// Helper function: given a width x height plane of RGBA or YUV(A) samples
// clean-up or smoothen the YUV or RGB samples under fully transparent area,
// to help compressibility (no guarantee, though).
WEBP_EXTERN void WebPCleanupTransparentArea(WebPPicture* picture);
// Scan the picture 'picture' for the presence of non fully opaque alpha values.
// Returns true in such case. Otherwise returns false (indicating that the
// alpha plane can be ignored altogether e.g.).
WEBP_EXTERN int WebPPictureHasTransparency(const WebPPicture* picture);
// Remove the transparency information (if present) by blending the color with
// the background color 'background_rgb' (specified as 24bit RGB triplet).
// After this call, all alpha values are reset to 0xff.
WEBP_EXTERN void WebPBlendAlpha(WebPPicture* picture, uint32_t background_rgb);
//------------------------------------------------------------------------------
// Main call
// Main encoding call, after config and picture have been initialized.
// 'picture' must be less than 16384x16384 in dimension (cf WEBP_MAX_DIMENSION),
// and the 'config' object must be a valid one.
// Returns false in case of error, true otherwise.
// In case of error, picture->error_code is updated accordingly.
// 'picture' can hold the source samples in both YUV(A) or ARGB input, depending
// on the value of 'picture->use_argb'. It is highly recommended to use
// the former for lossy encoding, and the latter for lossless encoding
// (when config.lossless is true). Automatic conversion from one format to
// another is provided but they both incur some loss.
WEBP_EXTERN int WebPEncode(const WebPConfig* config, WebPPicture* picture);
//------------------------------------------------------------------------------
#ifdef __cplusplus
} // extern "C"
#endif
#endif // WEBP_WEBP_ENCODE_H_
@@ -0,0 +1,530 @@
// Copyright 2011 Google Inc. All Rights Reserved.
//
// Use of this source code is governed by a BSD-style license
// that can be found in the COPYING file in the root of the source
// tree. An additional intellectual property rights grant can be found
// in the file PATENTS. All contributing project authors may
// be found in the AUTHORS file in the root of the source tree.
// -----------------------------------------------------------------------------
//
// RIFF container manipulation and encoding for WebP images.
//
// Authors: Urvang (urvang@google.com)
// Vikas (vikasa@google.com)
#ifndef WEBP_WEBP_MUX_H_
#define WEBP_WEBP_MUX_H_
#include "./mux_types.h"
#ifdef __cplusplus
extern "C" {
#endif
#define WEBP_MUX_ABI_VERSION 0x0108 // MAJOR(8b) + MINOR(8b)
//------------------------------------------------------------------------------
// Mux API
//
// This API allows manipulation of WebP container images containing features
// like color profile, metadata, animation.
//
// Code Example#1: Create a WebPMux object with image data, color profile and
// XMP metadata.
/*
int copy_data = 0;
WebPMux* mux = WebPMuxNew();
// ... (Prepare image data).
WebPMuxSetImage(mux, &image, copy_data);
// ... (Prepare ICCP color profile data).
WebPMuxSetChunk(mux, "ICCP", &icc_profile, copy_data);
// ... (Prepare XMP metadata).
WebPMuxSetChunk(mux, "XMP ", &xmp, copy_data);
// Get data from mux in WebP RIFF format.
WebPMuxAssemble(mux, &output_data);
WebPMuxDelete(mux);
// ... (Consume output_data; e.g. write output_data.bytes to file).
WebPDataClear(&output_data);
*/
// Code Example#2: Get image and color profile data from a WebP file.
/*
int copy_data = 0;
// ... (Read data from file).
WebPMux* mux = WebPMuxCreate(&data, copy_data);
WebPMuxGetFrame(mux, 1, &image);
// ... (Consume image; e.g. call WebPDecode() to decode the data).
WebPMuxGetChunk(mux, "ICCP", &icc_profile);
// ... (Consume icc_data).
WebPMuxDelete(mux);
WebPFree(data);
*/
// Note: forward declaring enumerations is not allowed in (strict) C and C++,
// the types are left here for reference.
// typedef enum WebPMuxError WebPMuxError;
// typedef enum WebPChunkId WebPChunkId;
typedef struct WebPMux WebPMux; // main opaque object.
typedef struct WebPMuxFrameInfo WebPMuxFrameInfo;
typedef struct WebPMuxAnimParams WebPMuxAnimParams;
typedef struct WebPAnimEncoderOptions WebPAnimEncoderOptions;
// Error codes
typedef enum WebPMuxError {
WEBP_MUX_OK = 1,
WEBP_MUX_NOT_FOUND = 0,
WEBP_MUX_INVALID_ARGUMENT = -1,
WEBP_MUX_BAD_DATA = -2,
WEBP_MUX_MEMORY_ERROR = -3,
WEBP_MUX_NOT_ENOUGH_DATA = -4
} WebPMuxError;
// IDs for different types of chunks.
typedef enum WebPChunkId {
WEBP_CHUNK_VP8X, // VP8X
WEBP_CHUNK_ICCP, // ICCP
WEBP_CHUNK_ANIM, // ANIM
WEBP_CHUNK_ANMF, // ANMF
WEBP_CHUNK_DEPRECATED, // (deprecated from FRGM)
WEBP_CHUNK_ALPHA, // ALPH
WEBP_CHUNK_IMAGE, // VP8/VP8L
WEBP_CHUNK_EXIF, // EXIF
WEBP_CHUNK_XMP, // XMP
WEBP_CHUNK_UNKNOWN, // Other chunks.
WEBP_CHUNK_NIL
} WebPChunkId;
//------------------------------------------------------------------------------
// Returns the version number of the mux library, packed in hexadecimal using
// 8bits for each of major/minor/revision. E.g: v2.5.7 is 0x020507.
WEBP_EXTERN int WebPGetMuxVersion(void);
//------------------------------------------------------------------------------
// Life of a Mux object
// Internal, version-checked, entry point
WEBP_EXTERN WebPMux* WebPNewInternal(int);
// Creates an empty mux object.
// Returns:
// A pointer to the newly created empty mux object.
// Or NULL in case of memory error.
static WEBP_INLINE WebPMux* WebPMuxNew(void) {
return WebPNewInternal(WEBP_MUX_ABI_VERSION);
}
// Deletes the mux object.
// Parameters:
// mux - (in/out) object to be deleted
WEBP_EXTERN void WebPMuxDelete(WebPMux* mux);
//------------------------------------------------------------------------------
// Mux creation.
// Internal, version-checked, entry point
WEBP_EXTERN WebPMux* WebPMuxCreateInternal(const WebPData*, int, int);
// Creates a mux object from raw data given in WebP RIFF format.
// Parameters:
// bitstream - (in) the bitstream data in WebP RIFF format
// copy_data - (in) value 1 indicates given data WILL be copied to the mux
// object and value 0 indicates data will NOT be copied.
// Returns:
// A pointer to the mux object created from given data - on success.
// NULL - In case of invalid data or memory error.
static WEBP_INLINE WebPMux* WebPMuxCreate(const WebPData* bitstream,
int copy_data) {
return WebPMuxCreateInternal(bitstream, copy_data, WEBP_MUX_ABI_VERSION);
}
//------------------------------------------------------------------------------
// Non-image chunks.
// Note: Only non-image related chunks should be managed through chunk APIs.
// (Image related chunks are: "ANMF", "VP8 ", "VP8L" and "ALPH").
// To add, get and delete images, use WebPMuxSetImage(), WebPMuxPushFrame(),
// WebPMuxGetFrame() and WebPMuxDeleteFrame().
// Adds a chunk with id 'fourcc' and data 'chunk_data' in the mux object.
// Any existing chunk(s) with the same id will be removed.
// Parameters:
// mux - (in/out) object to which the chunk is to be added
// fourcc - (in) a character array containing the fourcc of the given chunk;
// e.g., "ICCP", "XMP ", "EXIF" etc.
// chunk_data - (in) the chunk data to be added
// copy_data - (in) value 1 indicates given data WILL be copied to the mux
// object and value 0 indicates data will NOT be copied.
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux, fourcc or chunk_data is NULL
// or if fourcc corresponds to an image chunk.
// WEBP_MUX_MEMORY_ERROR - on memory allocation error.
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxSetChunk(
WebPMux* mux, const char fourcc[4], const WebPData* chunk_data,
int copy_data);
// Gets a reference to the data of the chunk with id 'fourcc' in the mux object.
// The caller should NOT free the returned data.
// Parameters:
// mux - (in) object from which the chunk data is to be fetched
// fourcc - (in) a character array containing the fourcc of the chunk;
// e.g., "ICCP", "XMP ", "EXIF" etc.
// chunk_data - (out) returned chunk data
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux, fourcc or chunk_data is NULL
// or if fourcc corresponds to an image chunk.
// WEBP_MUX_NOT_FOUND - If mux does not contain a chunk with the given id.
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxGetChunk(
const WebPMux* mux, const char fourcc[4], WebPData* chunk_data);
// Deletes the chunk with the given 'fourcc' from the mux object.
// Parameters:
// mux - (in/out) object from which the chunk is to be deleted
// fourcc - (in) a character array containing the fourcc of the chunk;
// e.g., "ICCP", "XMP ", "EXIF" etc.
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux or fourcc is NULL
// or if fourcc corresponds to an image chunk.
// WEBP_MUX_NOT_FOUND - If mux does not contain a chunk with the given fourcc.
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxDeleteChunk(
WebPMux* mux, const char fourcc[4]);
//------------------------------------------------------------------------------
// Images.
// Encapsulates data about a single frame.
struct WebPMuxFrameInfo {
WebPData bitstream; // image data: can be a raw VP8/VP8L bitstream
// or a single-image WebP file.
int x_offset; // x-offset of the frame.
int y_offset; // y-offset of the frame.
int duration; // duration of the frame (in milliseconds).
WebPChunkId id; // frame type: should be one of WEBP_CHUNK_ANMF
// or WEBP_CHUNK_IMAGE
WebPMuxAnimDispose dispose_method; // Disposal method for the frame.
WebPMuxAnimBlend blend_method; // Blend operation for the frame.
uint32_t pad[1]; // padding for later use
};
// Sets the (non-animated) image in the mux object.
// Note: Any existing images (including frames) will be removed.
// Parameters:
// mux - (in/out) object in which the image is to be set
// bitstream - (in) can be a raw VP8/VP8L bitstream or a single-image
// WebP file (non-animated)
// copy_data - (in) value 1 indicates given data WILL be copied to the mux
// object and value 0 indicates data will NOT be copied.
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux is NULL or bitstream is NULL.
// WEBP_MUX_MEMORY_ERROR - on memory allocation error.
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxSetImage(
WebPMux* mux, const WebPData* bitstream, int copy_data);
// Adds a frame at the end of the mux object.
// Notes: (1) frame.id should be WEBP_CHUNK_ANMF
// (2) For setting a non-animated image, use WebPMuxSetImage() instead.
// (3) Type of frame being pushed must be same as the frames in mux.
// (4) As WebP only supports even offsets, any odd offset will be snapped
// to an even location using: offset &= ~1
// Parameters:
// mux - (in/out) object to which the frame is to be added
// frame - (in) frame data.
// copy_data - (in) value 1 indicates given data WILL be copied to the mux
// object and value 0 indicates data will NOT be copied.
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux or frame is NULL
// or if content of 'frame' is invalid.
// WEBP_MUX_MEMORY_ERROR - on memory allocation error.
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxPushFrame(
WebPMux* mux, const WebPMuxFrameInfo* frame, int copy_data);
// Gets the nth frame from the mux object.
// The content of 'frame->bitstream' is allocated using WebPMalloc(), and NOT
// owned by the 'mux' object. It MUST be deallocated by the caller by calling
// WebPDataClear().
// nth=0 has a special meaning - last position.
// Parameters:
// mux - (in) object from which the info is to be fetched
// nth - (in) index of the frame in the mux object
// frame - (out) data of the returned frame
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux or frame is NULL.
// WEBP_MUX_NOT_FOUND - if there are less than nth frames in the mux object.
// WEBP_MUX_BAD_DATA - if nth frame chunk in mux is invalid.
// WEBP_MUX_MEMORY_ERROR - on memory allocation error.
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxGetFrame(
const WebPMux* mux, uint32_t nth, WebPMuxFrameInfo* frame);
// Deletes a frame from the mux object.
// nth=0 has a special meaning - last position.
// Parameters:
// mux - (in/out) object from which a frame is to be deleted
// nth - (in) The position from which the frame is to be deleted
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux is NULL.
// WEBP_MUX_NOT_FOUND - If there are less than nth frames in the mux object
// before deletion.
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxDeleteFrame(WebPMux* mux, uint32_t nth);
//------------------------------------------------------------------------------
// Animation.
// Animation parameters.
struct WebPMuxAnimParams {
uint32_t bgcolor; // Background color of the canvas stored (in MSB order) as:
// Bits 00 to 07: Alpha.
// Bits 08 to 15: Red.
// Bits 16 to 23: Green.
// Bits 24 to 31: Blue.
int loop_count; // Number of times to repeat the animation [0 = infinite].
};
// Sets the animation parameters in the mux object. Any existing ANIM chunks
// will be removed.
// Parameters:
// mux - (in/out) object in which ANIM chunk is to be set/added
// params - (in) animation parameters.
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux or params is NULL.
// WEBP_MUX_MEMORY_ERROR - on memory allocation error.
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxSetAnimationParams(
WebPMux* mux, const WebPMuxAnimParams* params);
// Gets the animation parameters from the mux object.
// Parameters:
// mux - (in) object from which the animation parameters to be fetched
// params - (out) animation parameters extracted from the ANIM chunk
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux or params is NULL.
// WEBP_MUX_NOT_FOUND - if ANIM chunk is not present in mux object.
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxGetAnimationParams(
const WebPMux* mux, WebPMuxAnimParams* params);
//------------------------------------------------------------------------------
// Misc Utilities.
// Sets the canvas size for the mux object. The width and height can be
// specified explicitly or left as zero (0, 0).
// * When width and height are specified explicitly, then this frame bound is
// enforced during subsequent calls to WebPMuxAssemble() and an error is
// reported if any animated frame does not completely fit within the canvas.
// * When unspecified (0, 0), the constructed canvas will get the frame bounds
// from the bounding-box over all frames after calling WebPMuxAssemble().
// Parameters:
// mux - (in) object to which the canvas size is to be set
// width - (in) canvas width
// height - (in) canvas height
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux is NULL; or
// width or height are invalid or out of bounds
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxSetCanvasSize(WebPMux* mux,
int width, int height);
// Gets the canvas size from the mux object.
// Note: This method assumes that the VP8X chunk, if present, is up-to-date.
// That is, the mux object hasn't been modified since the last call to
// WebPMuxAssemble() or WebPMuxCreate().
// Parameters:
// mux - (in) object from which the canvas size is to be fetched
// width - (out) canvas width
// height - (out) canvas height
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux, width or height is NULL.
// WEBP_MUX_BAD_DATA - if VP8X/VP8/VP8L chunk or canvas size is invalid.
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxGetCanvasSize(const WebPMux* mux,
int* width, int* height);
// Gets the feature flags from the mux object.
// Note: This method assumes that the VP8X chunk, if present, is up-to-date.
// That is, the mux object hasn't been modified since the last call to
// WebPMuxAssemble() or WebPMuxCreate().
// Parameters:
// mux - (in) object from which the features are to be fetched
// flags - (out) the flags specifying which features are present in the
// mux object. This will be an OR of various flag values.
// Enum 'WebPFeatureFlags' can be used to test individual flag values.
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux or flags is NULL.
// WEBP_MUX_BAD_DATA - if VP8X/VP8/VP8L chunk or canvas size is invalid.
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxGetFeatures(const WebPMux* mux,
uint32_t* flags);
// Gets number of chunks with the given 'id' in the mux object.
// Parameters:
// mux - (in) object from which the info is to be fetched
// id - (in) chunk id specifying the type of chunk
// num_elements - (out) number of chunks with the given chunk id
// Returns:
// WEBP_MUX_INVALID_ARGUMENT - if mux, or num_elements is NULL.
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxNumChunks(const WebPMux* mux,
WebPChunkId id, int* num_elements);
// Assembles all chunks in WebP RIFF format and returns in 'assembled_data'.
// This function also validates the mux object.
// Note: The content of 'assembled_data' will be ignored and overwritten.
// Also, the content of 'assembled_data' is allocated using WebPMalloc(), and
// NOT owned by the 'mux' object. It MUST be deallocated by the caller by
// calling WebPDataClear(). It's always safe to call WebPDataClear() upon
// return, even in case of error.
// Parameters:
// mux - (in/out) object whose chunks are to be assembled
// assembled_data - (out) assembled WebP data
// Returns:
// WEBP_MUX_BAD_DATA - if mux object is invalid.
// WEBP_MUX_INVALID_ARGUMENT - if mux or assembled_data is NULL.
// WEBP_MUX_MEMORY_ERROR - on memory allocation error.
// WEBP_MUX_OK - on success.
WEBP_EXTERN WebPMuxError WebPMuxAssemble(WebPMux* mux,
WebPData* assembled_data);
//------------------------------------------------------------------------------
// WebPAnimEncoder API
//
// This API allows encoding (possibly) animated WebP images.
//
// Code Example:
/*
WebPAnimEncoderOptions enc_options;
WebPAnimEncoderOptionsInit(&enc_options);
// Tune 'enc_options' as needed.
WebPAnimEncoder* enc = WebPAnimEncoderNew(width, height, &enc_options);
while(<there are more frames>) {
WebPConfig config;
WebPConfigInit(&config);
// Tune 'config' as needed.
WebPAnimEncoderAdd(enc, frame, timestamp_ms, &config);
}
WebPAnimEncoderAdd(enc, NULL, timestamp_ms, NULL);
WebPAnimEncoderAssemble(enc, webp_data);
WebPAnimEncoderDelete(enc);
// Write the 'webp_data' to a file, or re-mux it further.
*/
typedef struct WebPAnimEncoder WebPAnimEncoder; // Main opaque object.
// Forward declarations. Defined in encode.h.
struct WebPPicture;
struct WebPConfig;
// Global options.
struct WebPAnimEncoderOptions {
WebPMuxAnimParams anim_params; // Animation parameters.
int minimize_size; // If true, minimize the output size (slow). Implicitly
// disables key-frame insertion.
int kmin;
int kmax; // Minimum and maximum distance between consecutive key
// frames in the output. The library may insert some key
// frames as needed to satisfy this criteria.
// Note that these conditions should hold: kmax > kmin
// and kmin >= kmax / 2 + 1. Also, if kmax <= 0, then
// key-frame insertion is disabled; and if kmax == 1,
// then all frames will be key-frames (kmin value does
// not matter for these special cases).
int allow_mixed; // If true, use mixed compression mode; may choose
// either lossy and lossless for each frame.
int verbose; // If true, print info and warning messages to stderr.
uint32_t padding[4]; // Padding for later use.
};
// Internal, version-checked, entry point.
WEBP_EXTERN int WebPAnimEncoderOptionsInitInternal(
WebPAnimEncoderOptions*, int);
// Should always be called, to initialize a fresh WebPAnimEncoderOptions
// structure before modification. Returns false in case of version mismatch.
// WebPAnimEncoderOptionsInit() must have succeeded before using the
// 'enc_options' object.
static WEBP_INLINE int WebPAnimEncoderOptionsInit(
WebPAnimEncoderOptions* enc_options) {
return WebPAnimEncoderOptionsInitInternal(enc_options, WEBP_MUX_ABI_VERSION);
}
// Internal, version-checked, entry point.
WEBP_EXTERN WebPAnimEncoder* WebPAnimEncoderNewInternal(
int, int, const WebPAnimEncoderOptions*, int);
// Creates and initializes a WebPAnimEncoder object.
// Parameters:
// width/height - (in) canvas width and height of the animation.
// enc_options - (in) encoding options; can be passed NULL to pick
// reasonable defaults.
// Returns:
// A pointer to the newly created WebPAnimEncoder object.
// Or NULL in case of memory error.
static WEBP_INLINE WebPAnimEncoder* WebPAnimEncoderNew(
int width, int height, const WebPAnimEncoderOptions* enc_options) {
return WebPAnimEncoderNewInternal(width, height, enc_options,
WEBP_MUX_ABI_VERSION);
}
// Optimize the given frame for WebP, encode it and add it to the
// WebPAnimEncoder object.
// The last call to 'WebPAnimEncoderAdd' should be with frame = NULL, which
// indicates that no more frames are to be added. This call is also used to
// determine the duration of the last frame.
// Parameters:
// enc - (in/out) object to which the frame is to be added.
// frame - (in/out) frame data in ARGB or YUV(A) format. If it is in YUV(A)
// format, it will be converted to ARGB, which incurs a small loss.
// timestamp_ms - (in) timestamp of this frame in milliseconds.
// Duration of a frame would be calculated as
// "timestamp of next frame - timestamp of this frame".
// Hence, timestamps should be in non-decreasing order.
// config - (in) encoding options; can be passed NULL to pick
// reasonable defaults.
// Returns:
// On error, returns false and frame->error_code is set appropriately.
// Otherwise, returns true.
WEBP_EXTERN int WebPAnimEncoderAdd(
WebPAnimEncoder* enc, struct WebPPicture* frame, int timestamp_ms,
const struct WebPConfig* config);
// Assemble all frames added so far into a WebP bitstream.
// This call should be preceded by a call to 'WebPAnimEncoderAdd' with
// frame = NULL; if not, the duration of the last frame will be internally
// estimated.
// Parameters:
// enc - (in/out) object from which the frames are to be assembled.
// webp_data - (out) generated WebP bitstream.
// Returns:
// True on success.
WEBP_EXTERN int WebPAnimEncoderAssemble(WebPAnimEncoder* enc,
WebPData* webp_data);
// Get error string corresponding to the most recent call using 'enc'. The
// returned string is owned by 'enc' and is valid only until the next call to
// WebPAnimEncoderAdd() or WebPAnimEncoderAssemble() or WebPAnimEncoderDelete().
// Parameters:
// enc - (in/out) object from which the error string is to be fetched.
// Returns:
// NULL if 'enc' is NULL. Otherwise, returns the error string if the last call
// to 'enc' had an error, or an empty string if the last call was a success.
WEBP_EXTERN const char* WebPAnimEncoderGetError(WebPAnimEncoder* enc);
// Deletes the WebPAnimEncoder object.
// Parameters:
// enc - (in/out) object to be deleted
WEBP_EXTERN void WebPAnimEncoderDelete(WebPAnimEncoder* enc);
//------------------------------------------------------------------------------
#ifdef __cplusplus
} // extern "C"
#endif
#endif // WEBP_WEBP_MUX_H_
@@ -0,0 +1,98 @@
// Copyright 2012 Google Inc. All Rights Reserved.
//
// Use of this source code is governed by a BSD-style license
// that can be found in the COPYING file in the root of the source
// tree. An additional intellectual property rights grant can be found
// in the file PATENTS. All contributing project authors may
// be found in the AUTHORS file in the root of the source tree.
// -----------------------------------------------------------------------------
//
// Data-types common to the mux and demux libraries.
//
// Author: Urvang (urvang@google.com)
#ifndef WEBP_WEBP_MUX_TYPES_H_
#define WEBP_WEBP_MUX_TYPES_H_
#include <string.h> // memset()
#include "./types.h"
#ifdef __cplusplus
extern "C" {
#endif
// Note: forward declaring enumerations is not allowed in (strict) C and C++,
// the types are left here for reference.
// typedef enum WebPFeatureFlags WebPFeatureFlags;
// typedef enum WebPMuxAnimDispose WebPMuxAnimDispose;
// typedef enum WebPMuxAnimBlend WebPMuxAnimBlend;
typedef struct WebPData WebPData;
// VP8X Feature Flags.
typedef enum WebPFeatureFlags {
ANIMATION_FLAG = 0x00000002,
XMP_FLAG = 0x00000004,
EXIF_FLAG = 0x00000008,
ALPHA_FLAG = 0x00000010,
ICCP_FLAG = 0x00000020,
ALL_VALID_FLAGS = 0x0000003e
} WebPFeatureFlags;
// Dispose method (animation only). Indicates how the area used by the current
// frame is to be treated before rendering the next frame on the canvas.
typedef enum WebPMuxAnimDispose {
WEBP_MUX_DISPOSE_NONE, // Do not dispose.
WEBP_MUX_DISPOSE_BACKGROUND // Dispose to background color.
} WebPMuxAnimDispose;
// Blend operation (animation only). Indicates how transparent pixels of the
// current frame are blended with those of the previous canvas.
typedef enum WebPMuxAnimBlend {
WEBP_MUX_BLEND, // Blend.
WEBP_MUX_NO_BLEND // Do not blend.
} WebPMuxAnimBlend;
// Data type used to describe 'raw' data, e.g., chunk data
// (ICC profile, metadata) and WebP compressed image data.
// 'bytes' memory must be allocated using WebPMalloc() and such.
struct WebPData {
const uint8_t* bytes;
size_t size;
};
// Initializes the contents of the 'webp_data' object with default values.
static WEBP_INLINE void WebPDataInit(WebPData* webp_data) {
if (webp_data != NULL) {
memset(webp_data, 0, sizeof(*webp_data));
}
}
// Clears the contents of the 'webp_data' object by calling WebPFree().
// Does not deallocate the object itself.
static WEBP_INLINE void WebPDataClear(WebPData* webp_data) {
if (webp_data != NULL) {
WebPFree((void*)webp_data->bytes);
WebPDataInit(webp_data);
}
}
// Allocates necessary storage for 'dst' and copies the contents of 'src'.
// Returns true on success.
static WEBP_INLINE int WebPDataCopy(const WebPData* src, WebPData* dst) {
if (src == NULL || dst == NULL) return 0;
WebPDataInit(dst);
if (src->bytes != NULL && src->size != 0) {
dst->bytes = (uint8_t*)WebPMalloc(src->size);
if (dst->bytes == NULL) return 0;
memcpy((void*)dst->bytes, src->bytes, src->size);
dst->size = src->size;
}
return 1;
}
#ifdef __cplusplus
} // extern "C"
#endif
#endif // WEBP_WEBP_MUX_TYPES_H_
@@ -0,0 +1,68 @@
// Copyright 2010 Google Inc. All Rights Reserved.
//
// Use of this source code is governed by a BSD-style license
// that can be found in the COPYING file in the root of the source
// tree. An additional intellectual property rights grant can be found
// in the file PATENTS. All contributing project authors may
// be found in the AUTHORS file in the root of the source tree.
// -----------------------------------------------------------------------------
//
// Common types + memory wrappers
//
// Author: Skal (pascal.massimino@gmail.com)
#ifndef WEBP_WEBP_TYPES_H_
#define WEBP_WEBP_TYPES_H_
#include <stddef.h> // for size_t
#ifndef _MSC_VER
#include <inttypes.h>
#if defined(__cplusplus) || !defined(__STRICT_ANSI__) || \
(defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L)
#define WEBP_INLINE inline
#else
#define WEBP_INLINE
#endif
#else
typedef signed char int8_t;
typedef unsigned char uint8_t;
typedef signed short int16_t;
typedef unsigned short uint16_t;
typedef signed int int32_t;
typedef unsigned int uint32_t;
typedef unsigned long long int uint64_t;
typedef long long int int64_t;
#define WEBP_INLINE __forceinline
#endif /* _MSC_VER */
#ifndef WEBP_EXTERN
// This explicitly marks library functions and allows for changing the
// signature for e.g., Windows DLL builds.
# if defined(__GNUC__) && __GNUC__ >= 4
# define WEBP_EXTERN extern __attribute__ ((visibility ("default")))
# else
# define WEBP_EXTERN extern
# endif /* __GNUC__ >= 4 */
#endif /* WEBP_EXTERN */
// Macro to check ABI compatibility (same major revision number)
#define WEBP_ABI_IS_INCOMPATIBLE(a, b) (((a) >> 8) != ((b) >> 8))
#ifdef __cplusplus
extern "C" {
#endif
// Allocates 'size' bytes of memory. Returns NULL upon error. Memory
// must be deallocated by calling WebPFree(). This function is made available
// by the core 'libwebp' library.
WEBP_EXTERN void* WebPMalloc(size_t size);
// Releases memory returned by the WebPDecode*() functions (from decode.h).
WEBP_EXTERN void WebPFree(void* ptr);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // WEBP_WEBP_TYPES_H_
@@ -0,0 +1,29 @@
# How to Contribute
We'd love to accept your patches and contributions to this project. There are
just a few small guidelines you need to follow.
## Contributor License Agreement
Contributions to this project must be accompanied by a Contributor License
Agreement. You (or your employer) retain the copyright to your contribution;
this simply gives us permission to use and redistribute your contributions as
part of the project. Head over to <https://cla.developers.google.com/> to see
your current agreements on file or to sign a new one.
You generally only need to submit a CLA once, so if you've already submitted one
(even if it was for a different project), you probably don't need to do it
again.
## Code reviews
All submissions, including submissions by project members, require review. We
use a [Gerrit](https://www.gerritcodereview.com) instance hosted at
https://chromium-review.googlesource.com for this purpose. See the
[WebM Project page](https://www.webmproject.org/code/contribute/submitting-patches/)
for additional details.
## Community Guidelines
This project follows
[Google's Open Source Community Guidelines](https://opensource.google.com/conduct/).
@@ -0,0 +1,65 @@
# WebP Codec
```
__ __ ____ ____ ____
/ \\/ \/ _ \/ _ )/ _ \
\ / __/ _ \ __/
\__\__/\____/\_____/__/ ____ ___
/ _/ / \ \ / _ \/ _/
/ \_/ / / \ \ __/ \__
\____/____/\_____/_____/____/v1.2.4
```
WebP codec is a 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' to compress and decompress
images respectively.
See https://developers.google.com/speed/webp for details on the image format.
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
https://www.webmproject.org/license/software/ or the "COPYING" file for details.
An additional intellectual property rights grant can be found in the file
PATENTS.
## Files
* bin/cwebp : encoding tool
* bin/dwebp : decoding tool
* bin/gif2webp : gif conversion tool
* bin/img2webp : animation creation tool
* bin/vwebp : webp visualization tool
* bin/webpinfo : webp analysis tool
* bin/webpmux : webp muxing tool
* bin/anim\_diff : webp file comparison tool
* bin/anim\_dump : tool for dumping animation frames
* bin/get\_disto : tool for calculating file distortion
* bin/webp\_quality : webp quality estimation tool
* doc/ : manual in HTML and text formats
* lib/ : static libraries
* include/webp : headers
## Encoding and Decoding Tools
The bin/ directory contains tools to encode and decode images and animations,
view information about WebP images, and more. See the
[tools documentation](doc/tools.md).
## APIs
See the [APIs documentation](doc/api.md).
## Bugs
Please report all bugs to the issue tracker: https://bugs.chromium.org/p/webp
Patches welcome! See [how to contribute](CONTRIBUTING.md).
## Discuss
Email: webp-discuss@webmproject.org
Web: https://groups.google.com/a/webmproject.org/group/webp-discuss
@@ -0,0 +1,385 @@
# WebP APIs
## Encoding API
The main encoding functions are available in the header src/webp/encode.h
The ready-to-use ones are:
```c
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:
```c
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:
```c
#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 (!WebPPictureAlloc(&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);
```
## Decoding API
This is mainly just one function to call:
```c
#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:
```c
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:
```c
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:
```c
WebPIAppend(idec, fresh_data, size_of_fresh_data);
```
or by just mentioning the new size of the transmitted data:
```c
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.
```c
// 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);
```
## Webp Mux
WebPMux is a set of two libraries 'Mux' and 'Demux' for creation, extraction and
manipulation of an extended format WebP file, which can have features like color
profile, metadata and animation. Reference command-line tools `webpmux` and
`vwebp` as well as the WebP container specification
'doc/webp-container-spec.txt' are also provided in this package, see the
[tools documentation](tools.md).
### Mux API
The Mux API contains methods for adding data to and reading data from WebP
files. This API currently supports XMP/EXIF metadata, ICC profile and animation.
Other features may be added in subsequent releases.
Example#1 (pseudo code): Creating a WebPMux object with image data, color
profile and XMP metadata.
```c
int copy_data = 0;
WebPMux* mux = WebPMuxNew();
// ... (Prepare image data).
WebPMuxSetImage(mux, &image, copy_data);
// ... (Prepare ICC profile data).
WebPMuxSetChunk(mux, "ICCP", &icc_profile, copy_data);
// ... (Prepare XMP metadata).
WebPMuxSetChunk(mux, "XMP ", &xmp, copy_data);
// Get data from mux in WebP RIFF format.
WebPMuxAssemble(mux, &output_data);
WebPMuxDelete(mux);
// ... (Consume output_data; e.g. write output_data.bytes to file).
WebPDataClear(&output_data);
```
Example#2 (pseudo code): Get image and color profile data from a WebP file.
```c
int copy_data = 0;
// ... (Read data from file).
WebPMux* mux = WebPMuxCreate(&data, copy_data);
WebPMuxGetFrame(mux, 1, &image);
// ... (Consume image; e.g. call WebPDecode() to decode the data).
WebPMuxGetChunk(mux, "ICCP", &icc_profile);
// ... (Consume icc_profile).
WebPMuxDelete(mux);
free(data);
```
For a detailed Mux API reference, please refer to the header file
(src/webp/mux.h).
### Demux API
The Demux API enables extraction of images and extended format data from WebP
files. This API currently supports reading of XMP/EXIF metadata, ICC profile and
animated images. Other features may be added in subsequent releases.
Code example: Demuxing WebP data to extract all the frames, ICC profile and
EXIF/XMP metadata.
```c
WebPDemuxer* demux = WebPDemux(&webp_data);
uint32_t width = WebPDemuxGetI(demux, WEBP_FF_CANVAS_WIDTH);
uint32_t height = WebPDemuxGetI(demux, WEBP_FF_CANVAS_HEIGHT);
// ... (Get information about the features present in the WebP file).
uint32_t flags = WebPDemuxGetI(demux, WEBP_FF_FORMAT_FLAGS);
// ... (Iterate over all frames).
WebPIterator iter;
if (WebPDemuxGetFrame(demux, 1, &iter)) {
do {
// ... (Consume 'iter'; e.g. Decode 'iter.fragment' with WebPDecode(),
// ... and get other frame properties like width, height, offsets etc.
// ... see 'struct WebPIterator' below for more info).
} while (WebPDemuxNextFrame(&iter));
WebPDemuxReleaseIterator(&iter);
}
// ... (Extract metadata).
WebPChunkIterator chunk_iter;
if (flags & ICCP_FLAG) WebPDemuxGetChunk(demux, "ICCP", 1, &chunk_iter);
// ... (Consume the ICC profile in 'chunk_iter.chunk').
WebPDemuxReleaseChunkIterator(&chunk_iter);
if (flags & EXIF_FLAG) WebPDemuxGetChunk(demux, "EXIF", 1, &chunk_iter);
// ... (Consume the EXIF metadata in 'chunk_iter.chunk').
WebPDemuxReleaseChunkIterator(&chunk_iter);
if (flags & XMP_FLAG) WebPDemuxGetChunk(demux, "XMP ", 1, &chunk_iter);
// ... (Consume the XMP metadata in 'chunk_iter.chunk').
WebPDemuxReleaseChunkIterator(&chunk_iter);
WebPDemuxDelete(demux);
```
For a detailed Demux API reference, please refer to the header file
(src/webp/demux.h).
## AnimEncoder API
The AnimEncoder API can be used to create animated WebP images.
Code example:
```c
WebPAnimEncoderOptions enc_options;
WebPAnimEncoderOptionsInit(&enc_options);
// ... (Tune 'enc_options' as needed).
WebPAnimEncoder* enc = WebPAnimEncoderNew(width, height, &enc_options);
while(<there are more frames>) {
WebPConfig config;
WebPConfigInit(&config);
// ... (Tune 'config' as needed).
WebPAnimEncoderAdd(enc, frame, duration, &config);
}
WebPAnimEncoderAssemble(enc, webp_data);
WebPAnimEncoderDelete(enc);
// ... (Write the 'webp_data' to a file, or re-mux it further).
```
For a detailed AnimEncoder API reference, please refer to the header file
(src/webp/mux.h).
## AnimDecoder API
This AnimDecoder API allows decoding (possibly) animated WebP images.
Code Example:
```c
WebPAnimDecoderOptions dec_options;
WebPAnimDecoderOptionsInit(&dec_options);
// Tune 'dec_options' as needed.
WebPAnimDecoder* dec = WebPAnimDecoderNew(webp_data, &dec_options);
WebPAnimInfo anim_info;
WebPAnimDecoderGetInfo(dec, &anim_info);
for (uint32_t i = 0; i < anim_info.loop_count; ++i) {
while (WebPAnimDecoderHasMoreFrames(dec)) {
uint8_t* buf;
int timestamp;
WebPAnimDecoderGetNext(dec, &buf, &timestamp);
// ... (Render 'buf' based on 'timestamp').
// ... (Do NOT free 'buf', as it is owned by 'dec').
}
WebPAnimDecoderReset(dec);
}
const WebPDemuxer* demuxer = WebPAnimDecoderGetDemuxer(dec);
// ... (Do something using 'demuxer'; e.g. get EXIF/XMP/ICC data).
WebPAnimDecoderDelete(dec);
```
For a detailed AnimDecoder API reference, please refer to the header file
(src/webp/demux.h).
@@ -0,0 +1,663 @@
<!-- Creator : groff version 1.19.2 -->
<!-- CreationDate: Fri Aug 5 18:48:37 2022 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="generator" content="groff -Thtml, see www.gnu.org">
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<meta name="Content-Style" content="text/css">
<style type="text/css">
p { margin-top: 0; margin-bottom: 0; }
pre { margin-top: 0; margin-bottom: 0; }
table { margin-top: 0; margin-bottom: 0; }
</style>
<title>CWEBP</title>
</head>
<body>
<h1 align=center>CWEBP</h1>
<a href="#NAME">NAME</a><br>
<a href="#SYNOPSIS">SYNOPSIS</a><br>
<a href="#DESCRIPTION">DESCRIPTION</a><br>
<a href="#OPTIONS">OPTIONS</a><br>
<a href="#BUGS">BUGS</a><br>
<a href="#EXAMPLES">EXAMPLES</a><br>
<a href="#AUTHORS">AUTHORS</a><br>
<a href="#SEE ALSO">SEE ALSO</a><br>
<hr>
<a name="NAME"></a>
<h2>NAME</h2>
<p style="margin-left:11%; margin-top: 1em">cwebp &minus;
compress an image file to a WebP file</p>
<a name="SYNOPSIS"></a>
<h2>SYNOPSIS</h2>
<p style="margin-left:11%; margin-top: 1em"><b>cwebp</b>
[<i>options</i>] <i>input_file &minus;o
output_file.webp</i></p>
<a name="DESCRIPTION"></a>
<h2>DESCRIPTION</h2>
<p style="margin-left:11%; margin-top: 1em">This manual
page documents the <b>cwebp</b> command.</p>
<p style="margin-left:11%; margin-top: 1em"><b>cwebp</b>
compresses an image using the WebP format. Input format can
be either PNG, JPEG, TIFF, WebP or raw Y&rsquo;CbCr samples.
Note: Animated PNG and WebP files are not supported.</p>
<a name="OPTIONS"></a>
<h2>OPTIONS</h2>
<p style="margin-left:11%; margin-top: 1em">The basic
options are: <b><br>
&minus;o</b> <i>string</i></p>
<p style="margin-left:22%;">Specify the name of the output
WebP file. If omitted, <b>cwebp</b> will perform compression
but only report statistics. Using &quot;&minus;&quot; as
output name will direct output to &rsquo;stdout&rsquo;.</p>
<p style="margin-left:11%;"><b>&minus;&minus;</b>
<i>string</i></p>
<p style="margin-left:22%;">Explicitly specify the input
file. This option is useful if the input file starts with a
&rsquo;&minus;&rsquo; for instance. This option must appear
<b>last</b>. Any other options afterward will be
ignored.</p>
<p style="margin-left:11%;"><b>&minus;h,
&minus;help</b></p>
<p style="margin-left:22%;">A short usage summary.</p>
<p style="margin-left:11%;"><b>&minus;H,
&minus;longhelp</b></p>
<p style="margin-left:22%;">A summary of all the possible
options.</p>
<p style="margin-left:11%;"><b>&minus;version</b></p>
<p style="margin-left:22%;">Print the version number (as
major.minor.revision) and exit.</p>
<p style="margin-left:11%;"><b>&minus;lossless</b></p>
<p style="margin-left:22%;">Encode the image without any
loss. For images with fully transparent area, the invisible
pixel values (R/G/B or Y/U/V) will be preserved only if the
&minus;exact option is used.</p>
<p style="margin-left:11%;"><b>&minus;near_lossless</b>
<i>int</i></p>
<p style="margin-left:22%;">Specify the level of
near&minus;lossless image preprocessing. This option adjusts
pixel values to help compressibility, but has minimal impact
on the visual quality. It triggers lossless compression mode
automatically. The range is 0 (maximum preprocessing) to 100
(no preprocessing, the default). The typical value is around
60. Note that lossy with <b>&minus;q 100</b> can at times
yield better results.</p>
<p style="margin-left:11%;"><b>&minus;q</b>
<i>float</i></p>
<p style="margin-left:22%;">Specify the compression factor
for RGB channels between 0 and 100. The default is 75. <br>
In case of lossy compression (default), a small factor
produces a smaller file with lower quality. Best quality is
achieved by using a value of 100. <br>
In case of lossless compression (specified by the
<b>&minus;lossless</b> option), a small factor enables
faster compression speed, but produces a larger file.
Maximum compression is achieved by using a value of 100.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;z</b>
<i>int</i></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Switch on
<b>lossless</b> compression mode with the specified level
between 0 and 9, with level 0 being the fastest, 9 being the
slowest. Fast mode produces larger file size than slower
ones. A good default is <b>&minus;z 6</b>. This option is
actually a shortcut for some predefined settings for quality
and method. If options <b>&minus;q</b> or <b>&minus;m</b>
are subsequently used, they will invalidate the effect of
this option.</p></td>
</table>
<p style="margin-left:11%;"><b>&minus;alpha_q</b>
<i>int</i></p>
<p style="margin-left:22%;">Specify the compression factor
for alpha compression between 0 and 100. Lossless
compression of alpha is achieved using a value of 100, while
the lower values result in a lossy compression. The default
is 100.</p>
<p style="margin-left:11%;"><b>&minus;preset</b>
<i>string</i></p>
<p style="margin-left:22%;">Specify a set of
pre&minus;defined parameters to suit a particular type of
source material. Possible values are: <b>default</b>,
<b>photo</b>, <b>picture</b>, <b>drawing</b>, <b>icon</b>,
<b>text</b>. Since <b>&minus;preset</b> overwrites the other
parameters&rsquo; values (except the <b>&minus;q</b> one),
this option should preferably appear first in the order of
the arguments.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;m</b>
<i>int</i></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Specify the
compression method to use. This parameter controls the trade
off between encoding speed and the compressed file size and
quality. Possible values range from 0 to 6. Default value is
4. When higher values are used, the encoder will spend more
time inspecting additional encoding possibilities and decide
on the quality gain. Lower value can result in faster
processing time at the expense of larger file size and lower
compression quality.</p></td>
</table>
<p style="margin-left:11%;"><b>&minus;crop</b>
<i>x_position y_position width height</i></p>
<p style="margin-left:22%;">Crop the source to a rectangle
with top&minus;left corner at coordinates
(<b>x_position</b>, <b>y_position</b>) and size <b>width</b>
x <b>height</b>. This cropping area must be fully contained
within the source rectangle. Note: the cropping is applied
<i>before</i> any scaling.</p>
<p style="margin-left:11%;"><b>&minus;resize</b> <i>width
height</i></p>
<p style="margin-left:22%;">Resize the source to a
rectangle with size <b>width</b> x <b>height</b>. If either
(but not both) of the <b>width</b> or <b>height</b>
parameters is 0, the value will be calculated preserving the
aspect&minus;ratio. Note: scaling is applied <i>after</i>
cropping.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="4%">
<p style="margin-top: 1em" valign="top"><b>&minus;mt</b></p> </td>
<td width="7%"></td>
<td width="70%">
<p style="margin-top: 1em" valign="top">Use
multi&minus;threading for encoding, if possible.</p></td>
<td width="8%">
</td>
</table>
<p style="margin-left:11%;"><b>&minus;low_memory</b></p>
<p style="margin-left:22%;">Reduce memory usage of lossy
encoding by saving four times the compressed size
(typically). This will make the encoding slower and the
output slightly different in size and distortion. This flag
is only effective for methods 3 and up, and is off by
default. Note that leaving this flag off will have some side
effects on the bitstream: it forces certain bitstream
features like number of partitions (forced to 1). Note that
a more detailed report of bitstream size is printed by
<b>cwebp</b> when using this option.</p>
<p style="margin-left:11%; margin-top: 1em"><b>LOSSY
OPTIONS</b> <br>
These options are only effective when doing lossy encoding
(the default, with or without alpha). <b><br>
&minus;size</b> <i>int</i></p>
<p style="margin-left:22%;">Specify a target size (in
bytes) to try and reach for the compressed output. The
compressor will make several passes of partial encoding in
order to get as close as possible to this target. If both
<b>&minus;size</b> and <b>&minus;psnr</b> are used,
<b>&minus;size</b> value will prevail.</p>
<p style="margin-left:11%;"><b>&minus;psnr</b>
<i>float</i></p>
<p style="margin-left:22%;">Specify a target PSNR (in dB)
to try and reach for the compressed output. The compressor
will make several passes of partial encoding in order to get
as close as possible to this target. If both
<b>&minus;size</b> and <b>&minus;psnr</b> are used,
<b>&minus;size</b> value will prevail.</p>
<p style="margin-left:11%;"><b>&minus;pass</b>
<i>int</i></p>
<p style="margin-left:22%;">Set a maximum number of passes
to use during the dichotomy used by options
<b>&minus;size</b> or <b>&minus;psnr</b>. Maximum value is
10, default is 1. If options <b>&minus;size</b> or
<b>&minus;psnr</b> were used, but <b>&minus;pass</b>
wasn&rsquo;t specified, a default value of &rsquo;6&rsquo;
passes will be used.</p>
<p style="margin-left:11%;"><b>&minus;qrange</b> <i>int
int</i></p>
<p style="margin-left:22%;">Specifies the permissible
interval for the quality factor. This is particularly useful
when using multi-pass (<b>&minus;size</b> or
<b>&minus;psnr</b> options). Default is 0 100. If the
quality factor is outside this range, it will be clamped. If
the minimum value must be less or equal to the maximum
one.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="4%">
<p style="margin-top: 1em" valign="top"><b>&minus;af</b></p> </td>
<td width="7%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Turns
auto&minus;filter on. This algorithm will spend additional
time optimizing the filtering strength to reach a
well&minus;balanced quality.</p></td>
</table>
<p style="margin-left:11%;"><b>&minus;jpeg_like</b></p>
<p style="margin-left:22%;">Change the internal parameter
mapping to better match the expected size of JPEG
compression. This flag will generally produce an output file
of similar size to its JPEG equivalent (for the same
<b>&minus;q</b> setting), but with less visual
distortion.</p>
<p style="margin-left:11%;">Advanced options:</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;f</b>
<i>int</i></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Specify the
strength of the deblocking filter, between 0 (no filtering)
and 100 (maximum filtering). A value of 0 will turn off any
filtering. Higher value will increase the strength of the
filtering process applied after decoding the picture. The
higher the value the smoother the picture will appear.
Typical values are usually in the range of 20 to 50.</p></td>
</table>
<p style="margin-left:11%;"><b>&minus;sharpness</b>
<i>int</i></p>
<p style="margin-left:22%;">Specify the sharpness of the
filtering (if used). Range is 0 (sharpest) to 7 (least
sharp). Default is 0.</p>
<p style="margin-left:11%;"><b>&minus;strong</b></p>
<p style="margin-left:22%;">Use strong filtering (if
filtering is being used thanks to the <b>&minus;f</b>
option). Strong filtering is on by default.</p>
<p style="margin-left:11%;"><b>&minus;nostrong</b></p>
<p style="margin-left:22%;">Disable strong filtering (if
filtering is being used thanks to the <b>&minus;f</b>
option) and use simple filtering instead.</p>
<p style="margin-left:11%;"><b>&minus;sharp_yuv</b></p>
<p style="margin-left:22%;">Use more accurate and sharper
RGB-&gt;YUV conversion if needed. Note that this process is
slower than the default &rsquo;fast&rsquo; RGB-&gt;YUV
conversion.</p>
<p style="margin-left:11%;"><b>&minus;sns</b>
<i>int</i></p>
<p style="margin-left:22%;">Specify the amplitude of the
spatial noise shaping. Spatial noise shaping (or <b>sns</b>
for short) refers to a general collection of built&minus;in
algorithms used to decide which area of the picture should
use relatively less bits, and where else to better transfer
these bits. The possible range goes from 0 (algorithm is
off) to 100 (the maximal effect). The default value is
50.</p>
<p style="margin-left:11%;"><b>&minus;segments</b>
<i>int</i></p>
<p style="margin-left:22%;">Change the number of partitions
to use during the segmentation of the sns algorithm.
Segments should be in range 1 to 4. Default value is 4. This
option has no effect for methods 3 and up, unless
<b>&minus;low_memory</b> is used.</p>
<p style="margin-left:11%;"><b>&minus;partition_limit</b>
<i>int</i></p>
<p style="margin-left:22%;">Degrade quality by limiting the
number of bits used by some macroblocks. Range is 0 (no
degradation, the default) to 100 (full degradation). Useful
values are usually around 30&minus;70 for moderately large
images. In the VP8 format, the so&minus;called control
partition has a limit of 512k and is used to store the
following information: whether the macroblock is skipped,
which segment it belongs to, whether it is coded as intra
4x4 or intra 16x16 mode, and finally the prediction modes to
use for each of the sub&minus;blocks. For a very large
image, 512k only leaves room to few bits per 16x16
macroblock. The absolute minimum is 4 bits per macroblock.
Skip, segment, and mode information can use up almost all
these 4 bits (although the case is unlikely), which is
problematic for very large images. The partition_limit
factor controls how frequently the most bit&minus;costly
mode (intra 4x4) will be used. This is useful in case the
512k limit is reached and the following message is
displayed: <i>Error code: 6 (PARTITION0_OVERFLOW: Partition
#0 is too big to fit 512k)</i>. If using
<b>&minus;partition_limit</b> is not enough to meet the 512k
constraint, one should use less segments in order to save
more header bits per macroblock. See the
<b>&minus;segments</b> option.</p>
<p style="margin-left:11%; margin-top: 1em"><b>LOGGING
OPTIONS</b> <br>
These options control the level of output:</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="3%">
<p style="margin-top: 1em" valign="top"><b>&minus;v</b></p> </td>
<td width="8%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Print extra
information (encoding time in particular).</p></td>
</table>
<p style="margin-left:11%;"><b>&minus;print_psnr</b></p>
<p style="margin-left:22%;">Compute and report average PSNR
(Peak&minus;Signal&minus;To&minus;Noise ratio).</p>
<p style="margin-left:11%;"><b>&minus;print_ssim</b></p>
<p style="margin-left:22%;">Compute and report average SSIM
(structural similarity metric, see
https://en.wikipedia.org/wiki/SSIM for additional
details).</p>
<p style="margin-left:11%;"><b>&minus;print_lsim</b></p>
<p style="margin-left:22%;">Compute and report local
similarity metric (sum of lowest error amongst the
collocated pixel neighbors).</p>
<p style="margin-left:11%;"><b>&minus;progress</b></p>
<p style="margin-left:22%;">Report encoding progress in
percent.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;quiet</b></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Do not print
anything.</p> </td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;short</b></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Only print brief
information (output file size and PSNR) for testing
purposes.</p> </td>
</table>
<p style="margin-left:11%;"><b>&minus;map</b>
<i>int</i></p>
<p style="margin-left:22%;">Output additional
ASCII&minus;map of encoding information. Possible map values
range from 1 to 6. This is only meant to help debugging.</p>
<p style="margin-left:11%; margin-top: 1em"><b>ADDITIONAL
OPTIONS</b> <br>
More advanced options are: <b><br>
&minus;s</b> <i>width height</i></p>
<p style="margin-left:22%;">Specify that the input file
actually consists of raw Y&rsquo;CbCr samples following the
ITU&minus;R BT.601 recommendation, in 4:2:0 linear format.
The luma plane has size <b>width</b> x <b>height</b>.</p>
<p style="margin-left:11%;"><b>&minus;pre</b>
<i>int</i></p>
<p style="margin-left:22%;">Specify some preprocessing
steps. Using a value of &rsquo;2&rsquo; will trigger
quality&minus;dependent pseudo&minus;random dithering during
RGBA&minus;&gt;YUVA conversion (lossy compression only).</p>
<p style="margin-left:11%;"><b>&minus;alpha_filter</b>
<i>string</i></p>
<p style="margin-left:22%;">Specify the predictive
filtering method for the alpha plane. One of
&rsquo;none&rsquo;, &rsquo;fast&rsquo; or
&rsquo;best&rsquo;, in increasing complexity and slowness
order. Default is &rsquo;fast&rsquo;. Internally, alpha
filtering is performed using four possible predictions
(none, horizontal, vertical, gradient). The
&rsquo;best&rsquo; mode will try each mode in turn and pick
the one which gives the smaller size. The &rsquo;fast&rsquo;
mode will just try to form an a priori guess without testing
all modes.</p>
<p style="margin-left:11%;"><b>&minus;alpha_method</b>
<i>int</i></p>
<p style="margin-left:22%;">Specify the algorithm used for
alpha compression: 0 or 1. Algorithm 0 denotes no
compression, 1 uses WebP lossless format for compression.
The default is 1.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;exact</b></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Preserve RGB values
in transparent area. The default is off, to help
compressibility.</p> </td>
</table>
<p style="margin-left:11%;"><b>&minus;blend_alpha</b>
<i>int</i></p>
<p style="margin-left:22%;">This option blends the alpha
channel (if present) with the source using the background
color specified in hexadecimal as 0xrrggbb. The alpha
channel is afterward reset to the opaque value 255.</p>
<p style="margin-left:11%;"><b>&minus;noalpha</b></p>
<p style="margin-left:22%;">Using this option will discard
the alpha channel.</p>
<p style="margin-left:11%;"><b>&minus;hint</b>
<i>string</i></p>
<p style="margin-left:22%;">Specify the hint about input
image type. Possible values are: <b>photo</b>,
<b>picture</b> or <b>graph</b>.</p>
<p style="margin-left:11%;"><b>&minus;metadata</b>
<i>string</i></p>
<p style="margin-left:22%;">A comma separated list of
metadata to copy from the input to the output if present.
Valid values: <b>all</b>, <b>none</b>, <b>exif</b>,
<b>icc</b>, <b>xmp</b>. The default is <b>none</b>.</p>
<p style="margin-left:22%; margin-top: 1em">Note: each
input format may not support all combinations.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;noasm</b></p> </td>
<td width="2%"></td>
<td width="53%">
<p style="margin-top: 1em" valign="top">Disable all
assembly optimizations.</p></td>
<td width="25%">
</td>
</table>
<a name="BUGS"></a>
<h2>BUGS</h2>
<p style="margin-left:11%; margin-top: 1em">Please report
all bugs to the issue tracker:
https://bugs.chromium.org/p/webp <br>
Patches welcome! See this page to get started:
https://www.webmproject.org/code/contribute/submitting&minus;patches/</p>
<a name="EXAMPLES"></a>
<h2>EXAMPLES</h2>
<p style="margin-left:11%; margin-top: 1em">cwebp &minus;q
50 -lossless picture.png &minus;o picture_lossless.webp <br>
cwebp &minus;q 70 picture_with_alpha.png &minus;o
picture_with_alpha.webp <br>
cwebp &minus;sns 70 &minus;f 50 &minus;size 60000
picture.png &minus;o picture.webp <br>
cwebp &minus;o picture.webp &minus;&minus;
&minus;&minus;&minus;picture.png</p>
<a name="AUTHORS"></a>
<h2>AUTHORS</h2>
<p style="margin-left:11%; margin-top: 1em"><b>cwebp</b> is
a part of libwebp and was written by the WebP team. <br>
The latest source tree is available at
https://chromium.googlesource.com/webm/libwebp</p>
<p style="margin-left:11%; margin-top: 1em">This manual
page was written by Pascal Massimino
&lt;pascal.massimino@gmail.com&gt;, for the Debian project
(and may be used by others).</p>
<a name="SEE ALSO"></a>
<h2>SEE ALSO</h2>
<p style="margin-left:11%; margin-top: 1em"><b>dwebp</b>(1),
<b>gif2webp</b>(1) <br>
Please refer to https://developers.google.com/speed/webp/
for additional information.</p>
<hr>
</body>
</html>
@@ -0,0 +1,340 @@
CWEBP(1) CWEBP(1)
NAME
cwebp - compress an image file to a WebP file
SYNOPSIS
cwebp [options] input_file -o output_file.webp
DESCRIPTION
This manual page documents the cwebp command.
cwebp compresses an image using the WebP format. Input format can be
either PNG, JPEG, TIFF, WebP or raw Y'CbCr samples. Note: Animated PNG
and WebP files are not supported.
OPTIONS
The basic options are:
-o string
Specify the name of the output WebP file. If omitted, cwebp will
perform compression but only report statistics. Using "-" as
output name will direct output to 'stdout'.
-- string
Explicitly specify the input file. This option is useful if the
input file starts with a '-' for instance. This option must
appear last. Any other options afterward will be ignored.
-h, -help
A short usage summary.
-H, -longhelp
A summary of all the possible options.
-version
Print the version number (as major.minor.revision) and exit.
-lossless
Encode the image without any loss. For images with fully trans-
parent area, the invisible pixel values (R/G/B or Y/U/V) will be
preserved only if the -exact option is used.
-near_lossless int
Specify the level of near-lossless image preprocessing. This
option adjusts pixel values to help compressibility, but has
minimal impact on the visual quality. It triggers lossless com-
pression mode automatically. The range is 0 (maximum preprocess-
ing) to 100 (no preprocessing, the default). The typical value
is around 60. Note that lossy with -q 100 can at times yield
better results.
-q float
Specify the compression factor for RGB channels between 0 and
100. The default is 75.
In case of lossy compression (default), a small factor produces
a smaller file with lower quality. Best quality is achieved by
using a value of 100.
In case of lossless compression (specified by the -lossless
option), a small factor enables faster compression speed, but
produces a larger file. Maximum compression is achieved by
using a value of 100.
-z int Switch on lossless compression mode with the specified level
between 0 and 9, with level 0 being the fastest, 9 being the
slowest. Fast mode produces larger file size than slower ones. A
good default is -z 6. This option is actually a shortcut for
some predefined settings for quality and method. If options -q
or -m are subsequently used, they will invalidate the effect of
this option.
-alpha_q int
Specify the compression factor for alpha compression between 0
and 100. Lossless compression of alpha is achieved using a
value of 100, while the lower values result in a lossy compres-
sion. The default is 100.
-preset string
Specify a set of pre-defined parameters to suit a particular
type of source material. Possible values are: default, photo,
picture, drawing, icon, text. Since -preset overwrites the other
parameters' values (except the -q one), this option should
preferably appear first in the order of the arguments.
-m int Specify the compression method to use. This parameter controls
the trade off between encoding speed and the compressed file
size and quality. Possible values range from 0 to 6. Default
value is 4. When higher values are used, the encoder will spend
more time inspecting additional encoding possibilities and
decide on the quality gain. Lower value can result in faster
processing time at the expense of larger file size and lower
compression quality.
-crop x_position y_position width height
Crop the source to a rectangle with top-left corner at coordi-
nates (x_position, y_position) and size width x height. This
cropping area must be fully contained within the source rectan-
gle. Note: the cropping is applied before any scaling.
-resize width height
Resize the source to a rectangle with size width x height. If
either (but not both) of the width or height parameters is 0,
the value will be calculated preserving the aspect-ratio. Note:
scaling is applied after cropping.
-mt Use multi-threading for encoding, if possible.
-low_memory
Reduce memory usage of lossy encoding by saving four times the
compressed size (typically). This will make the encoding slower
and the output slightly different in size and distortion. This
flag is only effective for methods 3 and up, and is off by
default. Note that leaving this flag off will have some side
effects on the bitstream: it forces certain bitstream features
like number of partitions (forced to 1). Note that a more
detailed report of bitstream size is printed by cwebp when using
this option.
LOSSY OPTIONS
These options are only effective when doing lossy encoding (the
default, with or without alpha).
-size int
Specify a target size (in bytes) to try and reach for the com-
pressed output. The compressor will make several passes of par-
tial encoding in order to get as close as possible to this tar-
get. If both -size and -psnr are used, -size value will prevail.
-psnr float
Specify a target PSNR (in dB) to try and reach for the com-
pressed output. The compressor will make several passes of par-
tial encoding in order to get as close as possible to this tar-
get. If both -size and -psnr are used, -size value will prevail.
-pass int
Set a maximum number of passes to use during the dichotomy used
by options -size or -psnr. Maximum value is 10, default is 1.
If options -size or -psnr were used, but -pass wasn't specified,
a default value of '6' passes will be used.
-qrange int int
Specifies the permissible interval for the quality factor. This
is particularly useful when using multi-pass (-size or -psnr
options). Default is 0 100. If the quality factor is outside
this range, it will be clamped. If the minimum value must be
less or equal to the maximum one.
-af Turns auto-filter on. This algorithm will spend additional time
optimizing the filtering strength to reach a well-balanced qual-
ity.
-jpeg_like
Change the internal parameter mapping to better match the
expected size of JPEG compression. This flag will generally pro-
duce an output file of similar size to its JPEG equivalent (for
the same -q setting), but with less visual distortion.
Advanced options:
-f int Specify the strength of the deblocking filter, between 0 (no
filtering) and 100 (maximum filtering). A value of 0 will turn
off any filtering. Higher value will increase the strength of
the filtering process applied after decoding the picture. The
higher the value the smoother the picture will appear. Typical
values are usually in the range of 20 to 50.
-sharpness int
Specify the sharpness of the filtering (if used). Range is 0
(sharpest) to 7 (least sharp). Default is 0.
-strong
Use strong filtering (if filtering is being used thanks to the
-f option). Strong filtering is on by default.
-nostrong
Disable strong filtering (if filtering is being used thanks to
the -f option) and use simple filtering instead.
-sharp_yuv
Use more accurate and sharper RGB->YUV conversion if needed.
Note that this process is slower than the default 'fast'
RGB->YUV conversion.
-sns int
Specify the amplitude of the spatial noise shaping. Spatial
noise shaping (or sns for short) refers to a general collection
of built-in algorithms used to decide which area of the picture
should use relatively less bits, and where else to better trans-
fer these bits. The possible range goes from 0 (algorithm is
off) to 100 (the maximal effect). The default value is 50.
-segments int
Change the number of partitions to use during the segmentation
of the sns algorithm. Segments should be in range 1 to 4.
Default value is 4. This option has no effect for methods 3 and
up, unless -low_memory is used.
-partition_limit int
Degrade quality by limiting the number of bits used by some mac-
roblocks. Range is 0 (no degradation, the default) to 100 (full
degradation). Useful values are usually around 30-70 for moder-
ately large images. In the VP8 format, the so-called control
partition has a limit of 512k and is used to store the following
information: whether the macroblock is skipped, which segment it
belongs to, whether it is coded as intra 4x4 or intra 16x16
mode, and finally the prediction modes to use for each of the
sub-blocks. For a very large image, 512k only leaves room to
few bits per 16x16 macroblock. The absolute minimum is 4 bits
per macroblock. Skip, segment, and mode information can use up
almost all these 4 bits (although the case is unlikely), which
is problematic for very large images. The partition_limit factor
controls how frequently the most bit-costly mode (intra 4x4)
will be used. This is useful in case the 512k limit is reached
and the following message is displayed: Error code: 6 (PARTI-
TION0_OVERFLOW: Partition #0 is too big to fit 512k). If using
-partition_limit is not enough to meet the 512k constraint, one
should use less segments in order to save more header bits per
macroblock. See the -segments option.
LOGGING OPTIONS
These options control the level of output:
-v Print extra information (encoding time in particular).
-print_psnr
Compute and report average PSNR (Peak-Signal-To-Noise ratio).
-print_ssim
Compute and report average SSIM (structural similarity metric,
see https://en.wikipedia.org/wiki/SSIM for additional details).
-print_lsim
Compute and report local similarity metric (sum of lowest error
amongst the collocated pixel neighbors).
-progress
Report encoding progress in percent.
-quiet Do not print anything.
-short Only print brief information (output file size and PSNR) for
testing purposes.
-map int
Output additional ASCII-map of encoding information. Possible
map values range from 1 to 6. This is only meant to help debug-
ging.
ADDITIONAL OPTIONS
More advanced options are:
-s width height
Specify that the input file actually consists of raw Y'CbCr sam-
ples following the ITU-R BT.601 recommendation, in 4:2:0 linear
format. The luma plane has size width x height.
-pre int
Specify some preprocessing steps. Using a value of '2' will
trigger quality-dependent pseudo-random dithering during
RGBA->YUVA conversion (lossy compression only).
-alpha_filter string
Specify the predictive filtering method for the alpha plane. One
of 'none', 'fast' or 'best', in increasing complexity and slow-
ness order. Default is 'fast'. Internally, alpha filtering is
performed using four possible predictions (none, horizontal,
vertical, gradient). The 'best' mode will try each mode in turn
and pick the one which gives the smaller size. The 'fast' mode
will just try to form an a priori guess without testing all
modes.
-alpha_method int
Specify the algorithm used for alpha compression: 0 or 1. Algo-
rithm 0 denotes no compression, 1 uses WebP lossless format for
compression. The default is 1.
-exact Preserve RGB values in transparent area. The default is off, to
help compressibility.
-blend_alpha int
This option blends the alpha channel (if present) with the
source using the background color specified in hexadecimal as
0xrrggbb. The alpha channel is afterward reset to the opaque
value 255.
-noalpha
Using this option will discard the alpha channel.
-hint string
Specify the hint about input image type. Possible values are:
photo, picture or graph.
-metadata string
A comma separated list of metadata to copy from the input to the
output if present. Valid values: all, none, exif, icc, xmp.
The default is none.
Note: each input format may not support all combinations.
-noasm Disable all assembly optimizations.
BUGS
Please report all bugs to the issue tracker:
https://bugs.chromium.org/p/webp
Patches welcome! See this page to get started: https://www.webmpro-
ject.org/code/contribute/submitting-patches/
EXAMPLES
cwebp -q 50 -lossless picture.png -o picture_lossless.webp
cwebp -q 70 picture_with_alpha.png -o picture_with_alpha.webp
cwebp -sns 70 -f 50 -size 60000 picture.png -o picture.webp
cwebp -o picture.webp -- ---picture.png
AUTHORS
cwebp is a part of libwebp and was written by the WebP team.
The latest source tree is available at https://chromium.google-
source.com/webm/libwebp
This manual page was written by Pascal Massimino <pascal.mas-
simino@gmail.com>, for the Debian project (and may be used by others).
SEE ALSO
dwebp(1), gif2webp(1)
Please refer to https://developers.google.com/speed/webp/ for addi-
tional information.
March 17, 2022 CWEBP(1)
@@ -0,0 +1,386 @@
<!-- Creator : groff version 1.19.2 -->
<!-- CreationDate: Fri Aug 5 18:48:37 2022 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="generator" content="groff -Thtml, see www.gnu.org">
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<meta name="Content-Style" content="text/css">
<style type="text/css">
p { margin-top: 0; margin-bottom: 0; }
pre { margin-top: 0; margin-bottom: 0; }
table { margin-top: 0; margin-bottom: 0; }
</style>
<title>DWEBP</title>
</head>
<body>
<h1 align=center>DWEBP</h1>
<a href="#NAME">NAME</a><br>
<a href="#SYNOPSIS">SYNOPSIS</a><br>
<a href="#DESCRIPTION">DESCRIPTION</a><br>
<a href="#OPTIONS">OPTIONS</a><br>
<a href="#BUGS">BUGS</a><br>
<a href="#EXAMPLES">EXAMPLES</a><br>
<a href="#AUTHORS">AUTHORS</a><br>
<a href="#SEE ALSO">SEE ALSO</a><br>
<hr>
<a name="NAME"></a>
<h2>NAME</h2>
<p style="margin-left:11%; margin-top: 1em">dwebp &minus;
decompress a WebP file to an image file</p>
<a name="SYNOPSIS"></a>
<h2>SYNOPSIS</h2>
<p style="margin-left:11%; margin-top: 1em"><b>dwebp</b>
[<i>options</i>] <i>input_file.webp</i></p>
<a name="DESCRIPTION"></a>
<h2>DESCRIPTION</h2>
<p style="margin-left:11%; margin-top: 1em">This manual
page documents the <b>dwebp</b> command.</p>
<p style="margin-left:11%; margin-top: 1em"><b>dwebp</b>
decompresses WebP files into PNG, PAM, PPM or PGM images.
Note: Animated WebP files are not supported.</p>
<a name="OPTIONS"></a>
<h2>OPTIONS</h2>
<p style="margin-left:11%; margin-top: 1em">The basic
options are:</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="3%">
<p style="margin-top: 1em" valign="top"><b>&minus;h</b></p> </td>
<td width="8%"></td>
<td width="30%">
<p style="margin-top: 1em" valign="top">Print usage
summary.</p> </td>
<td width="48%">
</td>
</table>
<p style="margin-left:11%;"><b>&minus;version</b></p>
<p style="margin-left:22%;">Print the version number (as
major.minor.revision) and exit.</p>
<p style="margin-left:11%;"><b>&minus;o</b>
<i>string</i></p>
<p style="margin-left:22%;">Specify the name of the output
file (as PNG format by default). Using &quot;-&quot; as
output name will direct output to &rsquo;stdout&rsquo;.</p>
<p style="margin-left:11%;"><b>&minus;&minus;</b>
<i>string</i></p>
<p style="margin-left:22%;">Explicitly specify the input
file. This option is useful if the input file starts with an
&rsquo;&minus;&rsquo; for instance. This option must appear
<b>last</b>. Any other options afterward will be ignored. If
the input file is &quot;&minus;&quot;, the data will be read
from <i>stdin</i> instead of a file.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="7%">
<p style="margin-top: 1em" valign="top"><b>&minus;bmp</b></p> </td>
<td width="4%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Change the output
format to uncompressed BMP.</p></td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="7%">
<p style="margin-top: 1em" valign="top"><b>&minus;tiff</b></p> </td>
<td width="4%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Change the output
format to uncompressed TIFF.</p></td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="7%">
<p style="margin-top: 1em" valign="top"><b>&minus;pam</b></p> </td>
<td width="4%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Change the output
format to PAM (retains alpha).</p></td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="7%">
<p style="margin-top: 1em" valign="top"><b>&minus;ppm</b></p> </td>
<td width="4%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Change the output
format to PPM (discards alpha).</p></td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="7%">
<p style="margin-top: 1em" valign="top"><b>&minus;pgm</b></p> </td>
<td width="4%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Change the output
format to PGM. The output consists of luma/chroma samples
instead of RGB, using the IMC4 layout. This option is mainly
for verification and debugging purposes.</p></td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="7%">
<p style="margin-top: 1em" valign="top"><b>&minus;yuv</b></p> </td>
<td width="4%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Change the output
format to raw YUV. The output consists of
luma/chroma-U/chroma-V samples instead of RGB, saved
sequentially as individual planes. This option is mainly for
verification and debugging purposes.</p></td>
</table>
<p style="margin-left:11%;"><b>&minus;nofancy</b></p>
<p style="margin-left:22%;">Don&rsquo;t use the fancy
upscaler for YUV420. This may lead to jaggy edges
(especially the red ones), but should be faster.</p>
<p style="margin-left:11%;"><b>&minus;nofilter</b></p>
<p style="margin-left:22%;">Don&rsquo;t use the in-loop
filtering process even if it is required by the bitstream.
This may produce visible blocks on the non-compliant output,
but it will make the decoding faster.</p>
<p style="margin-left:11%;"><b>&minus;dither</b>
<i>strength</i></p>
<p style="margin-left:22%;">Specify a dithering
<b>strength</b> between 0 and 100. Dithering is a
post-processing effect applied to chroma components in lossy
compression. It helps by smoothing gradients and avoiding
banding artifacts.</p>
<p style="margin-left:11%;"><b>&minus;alpha_dither</b></p>
<p style="margin-left:22%;">If the compressed file contains
a transparency plane that was quantized during compression,
this flag will allow dithering the reconstructed plane in
order to generate smoother transparency gradients.</p>
<p style="margin-left:11%;"><b>&minus;nodither</b></p>
<p style="margin-left:22%;">Disable all dithering
(default).</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="4%">
<p style="margin-top: 1em" valign="top"><b>&minus;mt</b></p> </td>
<td width="7%"></td>
<td width="70%">
<p style="margin-top: 1em" valign="top">Use multi-threading
for decoding, if possible.</p></td>
<td width="8%">
</td>
</table>
<p style="margin-left:11%;"><b>&minus;crop</b>
<i>x_position y_position width height</i></p>
<p style="margin-left:22%;">Crop the decoded picture to a
rectangle with top-left corner at coordinates
(<b>x_position</b>, <b>y_position</b>) and size <b>width</b>
x <b>height</b>. This cropping area must be fully contained
within the source rectangle. The top-left corner will be
snapped to even coordinates if needed. This option is meant
to reduce the memory needed for cropping large images. Note:
the cropping is applied <i>before</i> any scaling.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="7%">
<p style="margin-top: 1em" valign="top"><b>&minus;flip</b></p> </td>
<td width="4%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Flip decoded image
vertically (can be useful for OpenGL textures for
instance).</p> </td>
</table>
<p style="margin-left:11%;"><b>&minus;resize</b>,
<b>&minus;scale</b> <i>width height</i></p>
<p style="margin-left:22%;">Rescale the decoded picture to
dimension <b>width</b> x <b>height</b>. This option is
mostly intended to reducing the memory needed to decode
large images, when only a small version is needed
(thumbnail, preview, etc.). Note: scaling is applied
<i>after</i> cropping. If either (but not both) of the
<b>width</b> or <b>height</b> parameters is 0, the value
will be calculated preserving the aspect-ratio.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;quiet</b></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Do not print
anything.</p> </td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;v</b></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Print extra
information (decoding time in particular).</p></td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;noasm</b></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Disable all
assembly optimizations.</p></td>
</table>
<a name="BUGS"></a>
<h2>BUGS</h2>
<p style="margin-left:11%; margin-top: 1em">Please report
all bugs to the issue tracker:
https://bugs.chromium.org/p/webp <br>
Patches welcome! See this page to get started:
https://www.webmproject.org/code/contribute/submitting&minus;patches/</p>
<a name="EXAMPLES"></a>
<h2>EXAMPLES</h2>
<p style="margin-left:11%; margin-top: 1em">dwebp
picture.webp &minus;o output.png <br>
dwebp picture.webp &minus;ppm &minus;o output.ppm <br>
dwebp &minus;o output.ppm &minus;&minus;
&minus;&minus;&minus;picture.webp <br>
cat picture.webp | dwebp &minus;o &minus; &minus;&minus;
&minus; &gt; output.ppm</p>
<a name="AUTHORS"></a>
<h2>AUTHORS</h2>
<p style="margin-left:11%; margin-top: 1em"><b>dwebp</b> is
a part of libwebp and was written by the WebP team. <br>
The latest source tree is available at
https://chromium.googlesource.com/webm/libwebp</p>
<p style="margin-left:11%; margin-top: 1em">This manual
page was written by Pascal Massimino
&lt;pascal.massimino@gmail.com&gt;, for the Debian project
(and may be used by others).</p>
<a name="SEE ALSO"></a>
<h2>SEE ALSO</h2>
<p style="margin-left:11%; margin-top: 1em"><b>cwebp</b>(1),
<b>gif2webp</b>(1), <b>webpmux</b>(1) <br>
Please refer to https://developers.google.com/speed/webp/
for additional information.</p>
<p style="margin-left:11%; margin-top: 1em"><b>Output file
format details</b> <br>
PAM: http://netpbm.sourceforge.net/doc/pam.html <br>
PGM: http://netpbm.sourceforge.net/doc/pgm.html <br>
PPM: http://netpbm.sourceforge.net/doc/ppm.html <br>
PNG: http://www.libpng.org/pub/png/png-sitemap.html#info</p>
<hr>
</body>
</html>
@@ -0,0 +1,142 @@
DWEBP(1) DWEBP(1)
NAME
dwebp - decompress a WebP file to an image file
SYNOPSIS
dwebp [options] input_file.webp
DESCRIPTION
This manual page documents the dwebp command.
dwebp decompresses WebP files into PNG, PAM, PPM or PGM images. Note:
Animated WebP files are not supported.
OPTIONS
The basic options are:
-h Print usage summary.
-version
Print the version number (as major.minor.revision) and exit.
-o string
Specify the name of the output file (as PNG format by default).
Using "-" as output name will direct output to 'stdout'.
-- string
Explicitly specify the input file. This option is useful if the
input file starts with an '-' for instance. This option must
appear last. Any other options afterward will be ignored. If
the input file is "-", the data will be read from stdin instead
of a file.
-bmp Change the output format to uncompressed BMP.
-tiff Change the output format to uncompressed TIFF.
-pam Change the output format to PAM (retains alpha).
-ppm Change the output format to PPM (discards alpha).
-pgm Change the output format to PGM. The output consists of
luma/chroma samples instead of RGB, using the IMC4 layout. This
option is mainly for verification and debugging purposes.
-yuv Change the output format to raw YUV. The output consists of
luma/chroma-U/chroma-V samples instead of RGB, saved sequen-
tially as individual planes. This option is mainly for verifica-
tion and debugging purposes.
-nofancy
Don't use the fancy upscaler for YUV420. This may lead to jaggy
edges (especially the red ones), but should be faster.
-nofilter
Don't use the in-loop filtering process even if it is required
by the bitstream. This may produce visible blocks on the non-
compliant output, but it will make the decoding faster.
-dither strength
Specify a dithering strength between 0 and 100. Dithering is a
post-processing effect applied to chroma components in lossy
compression. It helps by smoothing gradients and avoiding band-
ing artifacts.
-alpha_dither
If the compressed file contains a transparency plane that was
quantized during compression, this flag will allow dithering the
reconstructed plane in order to generate smoother transparency
gradients.
-nodither
Disable all dithering (default).
-mt Use multi-threading for decoding, if possible.
-crop x_position y_position width height
Crop the decoded picture to a rectangle with top-left corner at
coordinates (x_position, y_position) and size width x height.
This cropping area must be fully contained within the source
rectangle. The top-left corner will be snapped to even coordi-
nates if needed. This option is meant to reduce the memory
needed for cropping large images. Note: the cropping is applied
before any scaling.
-flip Flip decoded image vertically (can be useful for OpenGL textures
for instance).
-resize, -scale width height
Rescale the decoded picture to dimension width x height. This
option is mostly intended to reducing the memory needed to
decode large images, when only a small version is needed (thumb-
nail, preview, etc.). Note: scaling is applied after cropping.
If either (but not both) of the width or height parameters is 0,
the value will be calculated preserving the aspect-ratio.
-quiet Do not print anything.
-v Print extra information (decoding time in particular).
-noasm Disable all assembly optimizations.
BUGS
Please report all bugs to the issue tracker:
https://bugs.chromium.org/p/webp
Patches welcome! See this page to get started: https://www.webmpro-
ject.org/code/contribute/submitting-patches/
EXAMPLES
dwebp picture.webp -o output.png
dwebp picture.webp -ppm -o output.ppm
dwebp -o output.ppm -- ---picture.webp
cat picture.webp | dwebp -o - -- - > output.ppm
AUTHORS
dwebp is a part of libwebp and was written by the WebP team.
The latest source tree is available at https://chromium.google-
source.com/webm/libwebp
This manual page was written by Pascal Massimino <pascal.mas-
simino@gmail.com>, for the Debian project (and may be used by others).
SEE ALSO
cwebp(1), gif2webp(1), webpmux(1)
Please refer to https://developers.google.com/speed/webp/ for addi-
tional information.
Output file format details
PAM: http://netpbm.sourceforge.net/doc/pam.html
PGM: http://netpbm.sourceforge.net/doc/pgm.html
PPM: http://netpbm.sourceforge.net/doc/ppm.html
PNG: http://www.libpng.org/pub/png/png-sitemap.html#info
November 17, 2021 DWEBP(1)
@@ -0,0 +1,341 @@
<!-- Creator : groff version 1.19.2 -->
<!-- CreationDate: Fri Aug 5 18:48:38 2022 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta name="generator" content="groff -Thtml, see www.gnu.org">
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<meta name="Content-Style" content="text/css">
<style type="text/css">
p { margin-top: 0; margin-bottom: 0; }
pre { margin-top: 0; margin-bottom: 0; }
table { margin-top: 0; margin-bottom: 0; }
</style>
<title>GIF2WEBP</title>
</head>
<body>
<h1 align=center>GIF2WEBP</h1>
<a href="#NAME">NAME</a><br>
<a href="#SYNOPSIS">SYNOPSIS</a><br>
<a href="#DESCRIPTION">DESCRIPTION</a><br>
<a href="#OPTIONS">OPTIONS</a><br>
<a href="#BUGS">BUGS</a><br>
<a href="#EXAMPLES">EXAMPLES</a><br>
<a href="#AUTHORS">AUTHORS</a><br>
<a href="#SEE ALSO">SEE ALSO</a><br>
<hr>
<a name="NAME"></a>
<h2>NAME</h2>
<p style="margin-left:11%; margin-top: 1em">gif2webp
&minus; Convert a GIF image to WebP</p>
<a name="SYNOPSIS"></a>
<h2>SYNOPSIS</h2>
<p style="margin-left:11%; margin-top: 1em"><b>gif2webp</b>
[<i>options</i>] <i>input_file.gif &minus;o
output_file.webp</i></p>
<a name="DESCRIPTION"></a>
<h2>DESCRIPTION</h2>
<p style="margin-left:11%; margin-top: 1em">This manual
page documents the <b>gif2webp</b> command.</p>
<p style="margin-left:11%; margin-top: 1em"><b>gif2webp</b>
converts a GIF image to a WebP image.</p>
<a name="OPTIONS"></a>
<h2>OPTIONS</h2>
<p style="margin-left:11%; margin-top: 1em">The basic
options are: <b><br>
&minus;o</b> <i>string</i></p>
<p style="margin-left:22%;">Specify the name of the output
WebP file. If omitted, <b>gif2webp</b> will perform
conversion but only report statistics. Using
&quot;&minus;&quot; as output name will direct output to
&rsquo;stdout&rsquo;.</p>
<p style="margin-left:11%;"><b>&minus;&minus;</b>
<i>string</i></p>
<p style="margin-left:22%;">Explicitly specify the input
file. This option is useful if the input file starts with an
&rsquo;&minus;&rsquo; for instance. This option must appear
<b>last</b>. Any other options afterward will be ignored. If
the input file is &quot;&minus;&quot;, the data will be read
from <i>stdin</i> instead of a file.</p>
<p style="margin-left:11%;"><b>&minus;h,
&minus;help</b></p>
<p style="margin-left:22%;">Usage information.</p>
<p style="margin-left:11%;"><b>&minus;version</b></p>
<p style="margin-left:22%;">Print the version number (as
major.minor.revision) and exit.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;lossy</b></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Encode the image
using lossy compression.</p></td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;mixed</b></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Mixed compression
mode: optimize compression of the image by picking either
lossy or lossless compression for each frame
heuristically.</p> </td>
</table>
<p style="margin-left:11%;"><b>&minus;q</b>
<i>float</i></p>
<p style="margin-left:22%;">Specify the compression factor
for RGB channels between 0 and 100. The default is 75. <br>
In case of lossless compression (default), a small factor
enables faster compression speed, but produces a larger
file. Maximum compression is achieved by using a value of
100. <br>
In case of lossy compression (specified by the &minus;lossy
option), a small factor produces a smaller file with lower
quality. Best quality is achieved by using a value of
100.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;m</b>
<i>int</i></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Specify the
compression method to use. This parameter controls the trade
off between encoding speed and the compressed file size and
quality. Possible values range from 0 to 6. Default value is
4. When higher values are used, the encoder will spend more
time inspecting additional encoding possibilities and decide
on the quality gain. Lower value can result is faster
processing time at the expense of larger file size and lower
compression quality.</p></td>
</table>
<p style="margin-left:11%;"><b>&minus;min_size</b></p>
<p style="margin-left:22%;">Encode image to achieve
smallest size. This disables key frame insertion and picks
the dispose method resulting in the smallest output for each
frame. It uses lossless compression by default, but can be
combined with &minus;q, &minus;m, &minus;lossy or
&minus;mixed options.</p>
<p style="margin-left:11%;"><b>&minus;kmin</b> <i>int</i>
<b><br>
&minus;kmax</b> <i>int</i></p>
<p style="margin-left:22%;">Specify the minimum and maximum
distance between consecutive key frames (independently
decodable frames) in the output animation. The tool will
insert some key frames into the output animation as needed
so that this criteria is satisfied. <br>
A &rsquo;kmax&rsquo; value of 0 will turn off insertion of
key frames. A &rsquo;kmax&rsquo; value of 1 will result in
all frames being key frames. &rsquo;kmin&rsquo; value is not
taken into account in both these special cases. Typical
values are in the range 3 to 30. Default values are kmin =
9, kmax = 17 for lossless compression and kmin = 3, kmax = 5
for lossy compression. <br>
These two options are relevant only for animated images with
large number of frames (&gt;50). <br>
When lower values are used, more frames will be converted to
key frames. This may lead to smaller number of frames
required to decode a frame on average, thereby improving the
decoding performance. But this may lead to slightly bigger
file sizes. Higher values may lead to worse decoding
performance, but smaller file sizes. <br>
Some restrictions: <br>
(i) kmin &lt; kmax, <br>
(ii) kmin &gt;= kmax / 2 + 1 and <br>
(iii) kmax - kmin &lt;= 30. <br>
If any of these restrictions are not met, they will be
enforced automatically.</p>
<p style="margin-left:11%;"><b>&minus;metadata</b>
<i>string</i></p>
<p style="margin-left:22%;">A comma separated list of
metadata to copy from the input to the output if present.
Valid values: <b>all</b>, <b>none</b>, <b>icc</b>,
<b>xmp</b>. The default is <b>xmp</b>.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;f</b>
<i>int</i></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">For lossy encoding
only (specified by the &minus;lossy option). Specify the
strength of the deblocking filter, between 0 (no filtering)
and 100 (maximum filtering). A value of 0 will turn off any
filtering. Higher value will increase the strength of the
filtering process applied after decoding the picture. The
higher the value the smoother the picture will appear.
Typical values are usually in the range of 20 to 50.</p></td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;mt</b></p> </td>
<td width="2%"></td>
<td width="78%">
<p style="margin-top: 1em" valign="top">Use multi-threading
for encoding, if possible.</p></td>
</table>
<p style="margin-left:11%;"><b>&minus;loop_compatibility</b></p>
<p style="margin-left:22%;">If enabled, handle the loop
information in a compatible fashion for Chrome version prior
to M62 (inclusive) and Firefox.</p>
<table width="100%" border=0 rules="none" frame="void"
cellspacing="0" cellpadding="0">
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;v</b></p> </td>
<td width="2%"></td>
<td width="36%">
<p style="margin-top: 1em" valign="top">Print extra
information.</p> </td>
<td width="42%">
</td>
<tr valign="top" align="left">
<td width="11%"></td>
<td width="9%">
<p style="margin-top: 1em" valign="top"><b>&minus;quiet</b></p> </td>
<td width="2%"></td>
<td width="36%">
<p style="margin-top: 1em" valign="top">Do not print
anything.</p> </td>
<td width="42%">
</td>
</table>
<a name="BUGS"></a>
<h2>BUGS</h2>
<p style="margin-left:11%; margin-top: 1em">Please report
all bugs to the issue tracker:
https://bugs.chromium.org/p/webp <br>
Patches welcome! See this page to get started:
https://www.webmproject.org/code/contribute/submitting&minus;patches/</p>
<a name="EXAMPLES"></a>
<h2>EXAMPLES</h2>
<p style="margin-left:11%; margin-top: 1em">gif2webp
picture.gif &minus;o picture.webp <br>
gif2webp &minus;q 70 picture.gif &minus;o picture.webp <br>
gif2webp &minus;lossy &minus;m 3 picture.gif &minus;o
picture_lossy.webp <br>
gif2webp &minus;lossy &minus;f 50 picture.gif &minus;o
picture.webp <br>
gif2webp &minus;q 70 &minus;o picture.webp &minus;&minus;
&minus;&minus;&minus;picture.gif <br>
cat picture.gif | gif2webp &minus;o &minus; &minus;&minus;
&minus; &gt; output.webp</p>
<a name="AUTHORS"></a>
<h2>AUTHORS</h2>
<p style="margin-left:11%; margin-top: 1em"><b>gif2webp</b>
is a part of libwebp and was written by the WebP team. <br>
The latest source tree is available at
https://chromium.googlesource.com/webm/libwebp</p>
<p style="margin-left:11%; margin-top: 1em">This manual
page was written by Urvang Joshi &lt;urvang@google.com&gt;,
for the Debian project (and may be used by others).</p>
<a name="SEE ALSO"></a>
<h2>SEE ALSO</h2>
<p style="margin-left:11%; margin-top: 1em"><b>cwebp</b>(1),
<b>dwebp</b>(1), <b>webpmux</b>(1) <br>
Please refer to https://developers.google.com/speed/webp/
for additional information.</p>
<hr>
</body>
</html>
@@ -0,0 +1,152 @@
GIF2WEBP(1) GIF2WEBP(1)
NAME
gif2webp - Convert a GIF image to WebP
SYNOPSIS
gif2webp [options] input_file.gif -o output_file.webp
DESCRIPTION
This manual page documents the gif2webp command.
gif2webp converts a GIF image to a WebP image.
OPTIONS
The basic options are:
-o string
Specify the name of the output WebP file. If omitted, gif2webp
will perform conversion but only report statistics. Using "-"
as output name will direct output to 'stdout'.
-- string
Explicitly specify the input file. This option is useful if the
input file starts with an '-' for instance. This option must
appear last. Any other options afterward will be ignored. If
the input file is "-", the data will be read from stdin instead
of a file.
-h, -help
Usage information.
-version
Print the version number (as major.minor.revision) and exit.
-lossy Encode the image using lossy compression.
-mixed Mixed compression mode: optimize compression of the image by
picking either lossy or lossless compression for each frame
heuristically.
-q float
Specify the compression factor for RGB channels between 0 and
100. The default is 75.
In case of lossless compression (default), a small factor
enables faster compression speed, but produces a larger file.
Maximum compression is achieved by using a value of 100.
In case of lossy compression (specified by the -lossy option), a
small factor produces a smaller file with lower quality. Best
quality is achieved by using a value of 100.
-m int Specify the compression method to use. This parameter controls
the trade off between encoding speed and the compressed file
size and quality. Possible values range from 0 to 6. Default
value is 4. When higher values are used, the encoder will spend
more time inspecting additional encoding possibilities and
decide on the quality gain. Lower value can result is faster
processing time at the expense of larger file size and lower
compression quality.
-min_size
Encode image to achieve smallest size. This disables key frame
insertion and picks the dispose method resulting in the smallest
output for each frame. It uses lossless compression by default,
but can be combined with -q, -m, -lossy or -mixed options.
-kmin int
-kmax int
Specify the minimum and maximum distance between consecutive key
frames (independently decodable frames) in the output animation.
The tool will insert some key frames into the output animation
as needed so that this criteria is satisfied.
A 'kmax' value of 0 will turn off insertion of key frames. A
'kmax' value of 1 will result in all frames being key frames.
'kmin' value is not taken into account in both these special
cases. Typical values are in the range 3 to 30. Default values
are kmin = 9, kmax = 17 for lossless compression and kmin = 3,
kmax = 5 for lossy compression.
These two options are relevant only for animated images with
large number of frames (>50).
When lower values are used, more frames will be converted to key
frames. This may lead to smaller number of frames required to
decode a frame on average, thereby improving the decoding per-
formance. But this may lead to slightly bigger file sizes.
Higher values may lead to worse decoding performance, but
smaller file sizes.
Some restrictions:
(i) kmin < kmax,
(ii) kmin >= kmax / 2 + 1 and
(iii) kmax - kmin <= 30.
If any of these restrictions are not met, they will be enforced
automatically.
-metadata string
A comma separated list of metadata to copy from the input to the
output if present. Valid values: all, none, icc, xmp. The
default is xmp.
-f int For lossy encoding only (specified by the -lossy option). Spec-
ify the strength of the deblocking filter, between 0 (no filter-
ing) and 100 (maximum filtering). A value of 0 will turn off
any filtering. Higher value will increase the strength of the
filtering process applied after decoding the picture. The higher
the value the smoother the picture will appear. Typical values
are usually in the range of 20 to 50.
-mt Use multi-threading for encoding, if possible.
-loop_compatibility
If enabled, handle the loop information in a compatible fashion
for Chrome version prior to M62 (inclusive) and Firefox.
-v Print extra information.
-quiet Do not print anything.
BUGS
Please report all bugs to the issue tracker:
https://bugs.chromium.org/p/webp
Patches welcome! See this page to get started: https://www.webmpro-
ject.org/code/contribute/submitting-patches/
EXAMPLES
gif2webp picture.gif -o picture.webp
gif2webp -q 70 picture.gif -o picture.webp
gif2webp -lossy -m 3 picture.gif -o picture_lossy.webp
gif2webp -lossy -f 50 picture.gif -o picture.webp
gif2webp -q 70 -o picture.webp -- ---picture.gif
cat picture.gif | gif2webp -o - -- - > output.webp
AUTHORS
gif2webp is a part of libwebp and was written by the WebP team.
The latest source tree is available at https://chromium.google-
source.com/webm/libwebp
This manual page was written by Urvang Joshi <urvang@google.com>, for
the Debian project (and may be used by others).
SEE ALSO
cwebp(1), dwebp(1), webpmux(1)
Please refer to https://developers.google.com/speed/webp/ for addi-
tional information.
November 17, 2021 GIF2WEBP(1)

Some files were not shown because too many files have changed in this diff Show More