__ __ ____ ____ ____
/ \\/ \/ _ \/ _ )/ _ \
\ / __/ _ \ __/
\__\__/\____/\_____/__/ ____ ___
/ _/ / \ \ / _ \/ _/
/ \_/ / / \ \ __/ \__
\____/____/\_____/_____/____/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”文件中还找到了附加的知识产权授予。
通过以下方式运行:
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)检测。
在安装GNU工具的平台(例如gcc和make)上运行:
make -f makefile.unix
这会构建二进制文件examples/cwebp和examples/dwebp,以及静态库src/libwebp.a。由于这是一个基于autoconf工具(见下文)的完整安装系统的简单替代品,因此不提供系统范围内的安装。有关详细信息和支持,请参阅makefile.unix。
先决条件:编译器(例如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工具链稳定版发布可以在以下位置找到:https://community.imgtec.com/developers/mips/tools/codescape-mips-sdk/available-releases/
export PATH=$PATH:/path/to/toolchain/bin
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"
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支持有限:它只能帮助您编译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的支持有限:它只能帮助您编译libwebp, cwebp和dwebp以及webpmux_example。
先决条件:编译器(例如,带有autotools的gcc)和gradle。在类似Debian的系统上,以下命令应安装用于最小构建所需的所有内容:$ sudo apt-get install build-essential gradle
从git源构建时,您需要运行带有适当目标的Gradle wrapper,例如
./gradlew buildAllExecutables
要从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
具体如下:
在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/qcms 或 http://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
可以使用位于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
主要的编码函数在 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 基于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);
-------------------------------------- 虚拟示例结束
这里主要就是一个需要调用的函数
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 对图片进行增量解码。解码器状态存储在 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 头文件以获取更多信息。
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