Uhouzz-libwebp 0.5.1.2

Uhouzz-libwebp 0.5.1.2

测试已测试
语言语言 CC
许可证 BSD
发布最新版本2016年12月

iOSBoy维护。



  • Google Inc.
      __   __  ____  ____  ____
     /  \\/  \/  _ \/  _ )/  _ \
     \       /   __/  _  \   __/
      \__\__/\____/\_____/__/ ____  ___
            / _/ /    \    \ /  _ \/ _/
           /  \_/   / /   \ \   __/  \__
           \____/____/\_____/_____/____/v0.5.2

说明

WebP编解码器:用于编码和解码图像的WebP格式的库。该软件包包含可用来在其他程序中添加WebP支持的库,以及命令行工具'cwebp'和'dwebp'。

请参阅http://developers.google.com/speed/webp

最新的源代码树可在https://chromium.googlesource.com/webm/libwebp获取

它以与WebM项目相同的许可证发布。请参阅http://www.webmproject.org/license/software/或“COPYING”文件以获取详细信息。在“PATENTS”文件中还找到了附加的知识产权授予。

构建

Windows构建

通过以下方式运行:

nmake /f Makefile.vc CFG=release-static RTLIBCFG=static OBJDIR=output

output\release-static(x64|x86)\bin目录将包含工具cwebp.exe和dwebp.exe。output\release-static(x64|x86)\lib目录将包含libwebp静态库。目标架构(x86/x64)由Makefile.vc从系统路径中可用的Visual Studio编译器(cl.exe)检测。

使用makefile.unix的Unix构建

在安装GNU工具的平台(例如gcc和make)上运行:

make -f makefile.unix

这会构建二进制文件examples/cwebp和examples/dwebp,以及静态库src/libwebp.a。由于这是一个基于autoconf工具(见下文)的完整安装系统的简单替代品,因此不提供系统范围内的安装。有关详细信息和支持,请参阅makefile.unix。

使用autoconf工具

先决条件:编译器(例如gcc)、make、autoconf、automake、libtool。在类似于Debian的系统上,以下将安装构建所需的最小功能:$ sudo apt-get install gcc make autoconf automake libtool

从git源构建时,您需要运行autogen.sh以生成配置脚本。

./configure make make install

应该安装以下文件:

/usr/local/include/webp/decode.h /usr/local/include/webp/encode.h /usr/local/include/webp/types.h /usr/local/lib/libwebp.* /usr/local/bin/cwebp /usr/local/bin/dwebp

已安装。

注意:可以使用"--enable-libwebpdecoder"标志使用仅解码库libwebpdecoder。编码库独立构建且可以独立安装,只需在相应的Makefile.am配置文件中进行少量修改(请参阅其中的注释)。有关更多信息,请参阅'./configure --help'。

MIPS Linux构建

MIPS Linux工具链稳定版发布可以在以下位置找到:https://community.imgtec.com/developers/mips/tools/codescape-mips-sdk/available-releases/

添加工具链到PATH

export PATH=$PATH:/path/to/toolchain/bin

mips32r5(p5600)的32位构建

HOST=mips-mti-linux-gnu MIPS_CFLAGS="-O3 -mips32r5 -mabi=32 -mtune=p5600 -mmsa -mfp64 \ -msched-weight -mload-store-pairs -fPIE" MIPS_LDFLAGS="-mips32r5 -mabi=32 -mmsa -mfp64 -pie"

mips64r6(i6400)的64位构建

HOST=mips-img-linux-gnu MIPS_CFLAGS="-O3 -mips64r6 -mabi=64 -mtune=i6400 -mmsa -mfp64 \ -msched-weight -mload-store-pairs -fPIE" MIPS_LDFLAGS="-mips64r6 -mabi=64 -mmsa -mfp64 -pie"

./configure --host=${HOST} --build=config.guess \ CC="${HOST}-gcc -EL" \ CFLAGS="$MIPS_CFLAGS" \ LDFLAGS="$MIPS_LDFLAGS" make make install

CMake

CMake支持有限:它只能帮助您编译libwebp, cwebp和dwebp。

先决条件:编译器(例如,带有autotools的gcc)和CMake。在类似Debian的系统上,以下命令应安装用于最小构建所需的所有内容:$ sudo apt-get install build-essential cmake

从git源构建时,您将需要运行cmake以生成配置脚本文本。

mkdir build && cd build && cmake ../ make make install

如果还需要cwebp或dwebp,您需要通过CMake启用它们

cmake -DWEBP_BUILD_CWEBP=ON -DWEBP_BUILD_DWEBP=ON ../

或通过您的 favorite 接口(例如,ccmake 或 cmake-qt-gui)。

Gradle

Gradle的支持有限:它只能帮助您编译libwebp, cwebp和dwebp以及webpmux_example。

先决条件:编译器(例如,带有autotools的gcc)和gradle。在类似Debian的系统上,以下命令应安装用于最小构建所需的所有内容:$ sudo apt-get install build-essential gradle

从git源构建时,您需要运行带有适当目标的Gradle wrapper,例如

./gradlew buildAllExecutables

SWIG绑定

要从swig/libwebp.swig生成语言绑定,至少需要swig-1.3 (http://www.swig.org)。

当前映射以下函数:解码:WebPGetDecoderVersion WebPGetInfo WebPDecodeRGBA WebPDecodeARGB WebPDecodeBGRA WebPDecodeBGR WebPDecodeRGB

编码:WebPGetEncoderVersion WebPEncodeRGBA WebPEncodeBGRA WebPEncodeRGB WebPEncodeBGR WebPEncodeLosslessRGBA WebPEncodeLosslessBGRA WebPEncodeLosslessRGB WebPEncodeLosslessBGR

有关更详细的构建说明,请参阅swig/README。

Java绑定

要构建swig生成的JNI包装代码,至少需要JDK-1.5(或等效的)以支持枚举。输出目标是一个共享对象/DLL,可以通过System.loadLibrary("webp_jni")加载。

Python绑定

要构建swig生成的Python扩展代码,至少需要Python 2.6。Python < 2.6可能需要修改libwebp.swig或生成的代码的一些微小变化才能构建,但未进行测试。

编码工具

examples/目录中包含用于编码(cwebp)和解码(dwebp)图像的工具。

最简单的使用方法如下:cwebp 输入.png -q 80 -o 输出.webp,这将使用0到100的0为最低质量,100为最佳质量的80质量因子将输入文件转换为WebP文件。您还可以尝试使用 -lossless 标志,这样将无任何损失地压缩(RGBA格式)源。在这种情况下,-q 质量参数将控制尝试制作输出文件尽可能小的时间数量。

使用 -longhelp 命令行标志可以获得更长的选项列表

cwebp -longhelp 使用方法:cwebp [-preset <...>] [选项] 输入文件 [-o 输出文件]

如果未指定图像的输入大小(-s),则假定为PNG、JPEG、TIFF或WebP文件。

选项:-h / -help ............. 简短帮助 -H / -longhelp ......... 长度帮助 -q ............. 质量因子(0:小..100:大),默认=75 -alpha_q ......... 不透明度压缩质量(0..100),默认=100 -preset ....... 预设设置,可以是:默认、图片、照片、插图、图标、文本 -preset 必须放在第一位,因为它将覆盖其他参数 -z ............... 激活使用给定级别[0:快, ..., 9:最慢]的无损预设

-m ............... 压缩方法(0=快,6=慢),默认=4 -segments ........ 要使用的段数(1..4),默认=4 -size ............ 目标大小(字节数) -psnr .......... 目标PSNR(dB,通常是:42)

-s ......... YUV的输入大小(宽度 x 高度) -sns ............. 空间噪声 shaping(0:关闭,100:最大),默认=50 -f ............... 过滤强度(0=关闭..100),默认=60 -sharpness ....... 过滤锐度(0:最大..7:最小锐度),默认=0 -strong ................ 使用强化过滤而不是简单(默认) -nostrong .............. 使用简单过滤代替强化 -partition_limit . 将质量限制在第一个分区达到512k限制(0=无退化 ... 100=全部) -pass ............ 分析通过编号(1..10) -crop .. 使用给定的矩形裁剪图片 -resize ........ 调整大小(在裁剪后) -mt .................... 如果可用,使用多线程 -low_memory ............ 减少内存使用(较慢的编码) -map ............. 打印辅助信息 -print_psnr ............ 打印平均PSNR扭曲 -print_ssim ............ 打印平均SSIM扭曲 -print_lsim ............ 打印局部相似度扭曲 -d .......... 转储压缩输出(PGM文件) -alpha_method .... 透明度压缩方法(0..1),默认=1 -alpha_filter . Alpha平面预测过滤,可以是:无、快速(默认)或最佳 -exact ................. 在不透明区域中保留RGB值,默认=关闭 -blend_alpha ..... 将颜色与背景颜色混合,背景颜色以十六进制值表示,例如0xc0e0d0表示红色=0xc0,绿色=0xe0和蓝色=0xd0 -noalpha ............... 丢弃任何透明度信息 -lossless .............. 无损编码图像,默认=关闭 -near_lossless ... 使用近似无损图像预处理(0..100=关闭),默认=100 -hint ......... 指定图像特征提示,可以是:照片、图片或图表

-metadata ..... 从输入复制到输出的元数据逗号分隔列表。有效值:所有、无(默认)、exif、icc、xmp

-short ................. 压缩打印消息 -quiet ................. 不打印任何内容 -version ............... 打印版本号然后退出 -noasm ................. 禁用所有汇编优化 -v ..................... 详细信息,例如打印编码/解码时间 -progress .............. 报告编码进度

实验选项:-jpeg_like ............. 大致匹配预期的JPEG大小 -af .................... 自动调整过滤强度 -pre ............. 预处理过滤

您可以尝试以下主要选项以进一步调整视觉质量:-preset -sns -f -m

具体如下:

  • 'preset'会设置默认编码配置以针对特定类型的输入。它应出现在选项列表中的第一个位置,以便后续选项可以在此基础上生效。默认值为'default'。
  • 'sns' 将逐步开启(从0到100)一些额外的视觉效果优化(如:分割图加强)。这个选项会以不同的方式分配比特。它尝试从图片的“简单”部分取出比特,并用它们替换“困难”的部分。通常,提高sns值(固定-q值)会导致文件更大,但质量更好。典型值约为'75'。
  • 'f' 选项直接链接到编解码器内循环处理中使用的过滤强度。值越高,高压缩区域的视觉效果越平滑。这在目的是生成非常小的文件时尤其有用。典型值约为20-30。注意,使用选项-strong/-nostrong会改变过滤的类型。使用 "-f 0" 来关闭过滤。
  • 'm' 控制编码速度和质量之间的权衡。默认值是4。您可以使用-m 5或-m 6来探索更多(耗时)的编码可能性。较低的值将以牺牲质量为代价实现更快的编码。

解码工具

在examples/dwebp.c中有一个解码示例,它将.webp文件解码为PNG图像文件(以及其他格式)。这只是为了演示API的使用。您可以使用以下命令验证文件test.webp解码后与test_ref.ppm完全相同

cd examples ./dwebp test.webp -ppm -o test.ppm diff test.ppm test_ref.ppm

使用 -h 可以查看选项的完整列表

dwebp -h 使用方法:dwebp 输入文件 [选项] [-o 输出文件]

将WebP图像文件解码为PNG格式 [默认] 使用以下选项将转换为其他图像格式:-pam ......... 将原始RGBA样本保存为彩色PAM -ppm ......... 将原始RGB样本保存为彩色PPM -bmp ......... 以未压缩BMP格式保存 -tiff ........ 以未压缩TIFF格式保存 -pgm ......... 将原始YUV样本保存为具有IMC4布局的灰度PGM文件 -yuv ......... 以平坦布局保存原始YUV样本

其他选项包括:-version ..... 打印版本号并退出 -nofancy ..... 不使用花哨的YUV420上采样器 -nofilter .... 禁用内循环过滤 -nodither .... 禁用抖动 -dither .. 抖动强度(0..100) -alpha_dither 如需要,使用alpha平面抖动 -mt .......... 使用多线程 -crop ... 使用指定的矩形裁剪输出 -resize ......... 缩放输出(在任何裁剪之后) -flip ........ 竖直翻转输出 -alpha ....... 只保存alpha平面 -incremental . 使用增量解码(对测试很有用) -h ........... 此帮助信息 -v ........... 详细模式(例如打印编码/解码时间) -quiet ....... 静音模式,不打印任何内容 -noasm ....... 禁用所有汇编优化

可视化工具

在examples/目录下有一个名为'vwebp'的小型自助可视化工具。它使用OpenGL打开一个简单的绘图窗口并显示解码的WebP文件。它尚未集成到automake构建系统中,但您可以使用以下建议手动编译它。

使用方法:vwebp 输入文件 [选项]

解码WebP图像文件并使用OpenGL进行可视化。选项包括:-version ..... 打印版本号并退出 -noicc ....... 如果存在,则不使用icc配置文件 -nofancy ..... 不使用花哨的YUV420上采样器 -nofilter .... 禁用内循环过滤 -dither dithering强度(0..100),默认=50 -noalphadither 禁用alpha平面抖动 -mt .......... 使用多线程 -info ........ 打印信息 -h ........... 此帮助信息

键盘快捷键:'c' ... 切换使用色彩配置文件 'i' ... 添加文件信息覆盖 'd' ... 禁用混合与回收(调试) 'q' / 'Q' / ESC ... 退出

构建

先决条件:1) OpenGL 及 OpenGL 工具包(GLUT) Linux: $ sudo apt-get install freeglut3-dev mesa-common-dev Mac + XCode:- 这些库应包含在OpenGL / GLUT框架中。Windows:http://freeglut.sourceforge.net/index.php#download

2)(可选)qcms(快速色彩管理系统) i. 从Mozilla / Chromium下载qcms:http://hg.mozilla.org/mozilla-central/file/0e7639e3bdfb/gfx/qcmshttp://src.chromium.org/viewvc/chrome/trunk/src/third_party/qcms ii. 编译源文件为 libqcms.a / qcms.lib iii. 更新 makefile.unix / Makefile.vc a) 定义 WEBP_HAVE_QCMS b) 更新包含/库路径以引用 qcms 目录。

使用 makefile.unix / Makefile.vc 构建:$ make -f makefile.unix examples/vwebp

nmake /f Makefile.vc CFG=release-static \ ../obj/x64/release-static/bin/vwebp.exe

动画创建工具

实用工具'img2webp'可以将一系列输入图像(PNG、JPEG等)转换为动画WebP文件。它提供对持续时间、编码模式等的高级控制。

用法

img2webp [文件级别选项] [图像文件...] [每帧选项...]

文件级别选项(仅在压缩开始时使用):-min_size ............ 最小化大小 -loop .......... 循环次数(默认:0,=无限循环) -kmax .......... 两个关键帧之间的最大帧数(0=仅关键帧) -kmin .......... 两个关键帧之间最小帧数(0=禁用所有关键帧) -mixed ............... 使用混合的有损/无损自动模式 -v ................... 详细模式 -h ................... 此帮助

每帧选项(仅用于后续图像输入):-d ............. 帧持续时间(毫秒)(默认:100) -lossless ........... 使用无损模式(默认) -lossy ... ........... 使用有损模式 -q ........... 质量 -m ............. 要使用的方法

示例:img2webp -loop 2 in0.png -lossy in1.jpg -d 80 in2.tiff -o out.webp

动画GIF转换

可以使用位于examples/目录下的gif2webp实用工具将动画GIF文件转换为带有动画的WebP文件。然后可以使用vwebp查看这些文件。

用法:gif2webp [选项] gif_file -o webp_file 选项:-h / -help ............. 此帮助 -lossy ................. 使用有损压缩编码图像 -mixed ................. 对于图像中的每一帧,分别选择有损或无损压缩 -q ............. 质量因子(0:小..100:大) -m ............... 压缩方法(0=快,6=最慢) -min_size .............. 最小化输出大小(默认:关闭) 默认为无损压缩;可以与 -q、-m、-lossy 或 -mixed 选项结合使用 -kmin ............ 关键帧之间的最小距离 -kmax ............ 关键帧之间的最大距离 -f ............... 过滤强度(0=关闭..100) -metadata ..... 从输入复制到的输出的元数据列表,如果存在则有值:all, none, icc, xmp(默认) -mt .................... 如果可用,使用多线程

-version ............... 打印版本号并退出 -v ..................... 详细模式 -quiet ................. 不打印任何内容

构建

安装libgif开发文件后,可以使用makefile.unix构建gif2webp:$ make -f makefile.unix examples/gif2webp

或使用autoconf: $ ./configure --enable-everything $ make

动画图像比较

在 examples/ 目录下的 anim_diff 测试工具可以用于比较两张动画图像(可以是 GIF 或 WebP 格式)。

用法:anim_diff [选项]

选项:-dump_frames 将解码帧以 PAM 格式输出 -min_psnr ... 每帧的最小 PSNR 值 -raw_comparison ... 如果不使用此标志,在比较前将 RGB 预乘

构建

安装了 libgif 开发文件和 C++ 编译器后,可以使用 makefile.unix 构建anim_diff:$ make -f makefile.unix examples/anim_diff

或使用autoconf: $ ./configure --enable-everything $ make

编码 API

主要的编码函数在 src/webp/encode.h 头文件中。现成的函数有: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);

它们将原始 RGB 样本转换成 WebP 数据。唯一提供的控制是质量因子。

有一些针对无损格式使用的变体

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);

当然在这种情况下,不需要质量因子,因为压缩在没有任何输入值损失的情况下进行,代价是更大的输出大小。

高级编码 API

更高级的 API 基于WebPConfig和WebPPicture结构。

WebPConfig包含编码设置,并不与特定图片绑定。WebPPicture包含输入数据,在它上面使用一些WebPConfig进行压缩。编码流程如下

-------------------------------------- BEGIN PSEUDO EXAMPLE

包含

// 设置配置,从预设开始并调整一些额外的参数 WebPConfig config; if (!WebPConfigPreset(&config, WEBP_PRESET_PHOTO, quality_factor)) return 0; // 版本错误 } // ... 额外调整 config.sns_strength = 90; config.filter_sharpness = 6; config_error = WebPValidateConfig(&config); // 不强制要求,但有用

// 设置输入数据 WebPPicture pic; if (!WebPPictureInit(&pic)) { return 0; // 版本错误 } pic.width = width; pic.height = height; // 宽度为 width,高度为 height 的已分配图片 // 如果内存不足,则返回错误 } // 到目前为止,'pic' 已初始化为一个容器,可以接收 Y/U/V 样本。 // 或者,可以使用现成的导入函数,例如 WebPPictureImportRGB(),这将负责内存分配。 // 在任何情况下,在此之后,将必须调用 WebPPictureFree(&pic) 来回收内存。

// 设置一个字节输出写入方法,例如 WebPMemoryWriter。 WebPMemoryWriter wrt; WebPMemoryWriterInit(&wrt); // 初始化 'wrt'

pic.writer = MyFileWriter; pic.custom_ptr = my_opaque_structure_to_make_MyFileWriter_work;

// 压缩! int ok = WebPEncode(&config, &pic); // ok = 0 => 错误发生! WebPPictureFree(&pic); // 必须独立于 'ok' 结果调用。

// 到此为止,输出数据应已由写入器处理。 // -> 压缩数据是描述为 wrt.mem / wrt.size 的内存缓冲区。

// 分配压缩数据使用的内存 WebPMemoryWriterClear(&wrt);

-------------------------------------- 虚拟示例结束

解码API

这里主要就是一个需要调用的函数

包含 "webp/decode.h"

uint8_t* WebPDecodeRGB(const uint8_t* data, size_t data_size, int* width, int* height);

请查看文件 src/webp/decode.h 获取详细信息。这里提供了在 BGR/RGBA/ARGB/BGRA 顺序中进行解码的变体,以及解码到原始 Y'CbCr 样本的变体。还可以直接将图像解码到预分配的缓冲区。

为了检测 WebP 文件并获取图片的尺寸,提供了函数:int WebPGetInfo(const uint8_t* data, size_t data_size, int* width, int* height);。使用它时不涉及解码。

增量解码API

在数据逐步传输的情况下,可以使用稍微复杂的 API 对图片进行增量解码。解码器状态存储在 WebPIDecoder 对象的一个实例中。该对象可以创建为解码 RGB 或 Y'CbCr 样本。例如

WebPDecBuffer buffer; WebPInitDecBuffer(&buffer); buffer.colorspace = MODE_BGR; ... WebPIDecoder* idec = WebPINewDecoder(&buffer);

随着数据的 progressively 提供了,这个增量解码对象可以用来进一步解码图片。有两种(互相排斥)的方式传递新到达的数据

通过附加新的字节

WebPIAppend(idec, fresh_data, size_of_fresh_data);

或者只是提及传输数据的新的大小

WebPIUpdate(idec, buffer, size_of_transmitted_buffer);

注意,在调用 WebPIUpdate 之间,"buffer" 可以被修改,特别是在缓冲区被调整大小以适应更大的数据时。

这些函数将返回解码状态:如果解码尚未完成则返回 VP8_STATUS_SUSPENDED,如果解码完成则返回 VP8_STATUS_OK。任何其他状态都是错误条件。

"idec" 对象必须始终通过调用:WebPDelete(idec) 来释放(即使在错误条件下)。

为了检索部分解码的图片样本,必须使用对应的方法:WebPIDecGetRGB 或 WebPIDecGetYUVA。它将返回最后的可显示像素行。

最后,请注意解码也可以将数据解码到预分配的像素缓冲区。在创建 WebPIDecoder,调用 WebPINewRGB() 或 WebPINewYUVA() 时必须传递此缓冲区。

请查看 src/webp/decode.h 头文件以获取更多信息。

高级解码API

WebP 解码支持一个高级 API,该 API 提供了实时裁剪和缩放,对于内存受限的环境(如手机)非常有用。基本上,当只需要快速预览或对太大图片的缩略部分时,内存使用将随输出大小而变化,而不是输入大小。还有机会节省一些 CPU。

-------------------------------------- 开始虚拟示例 // A) 创建配置对象 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);

-------------------------------------- 虚拟示例结束

错误

请向问题跟踪器报告所有错误: https://bugs.chromium.org/p/webp 欢迎补丁!有关开始的信息,请参阅此页: http://www.webmproject.org/code/contribute/submitting-patches/

讨论

电子邮件: [email protected] 网站: http://groups.google.com/a/webmproject.org/group/webp-discuss