Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
webp_Android10_r33_CVE-2023-1999 — CVE-2023-1999的概念验证漏洞利用,针对Android 10 (r33)上的WebP编解码库。展示了libwebp库中的堆缓冲区溢出漏洞,可通过特制的WebP图像实现远程代码执行。 | Kitploit
工具/GitHubGitHub/pazhanivelmani/webp_android10_r33_cve-2023-1999
静态分析漏洞分析代码分析漏洞利用模糊测试二进制分析
GitHubpazhanivelmani/webp_android10_r33_cve-2023-1999

webp_Android10_r33_CVE-2023-1999

CVE-2023-1999的概念验证漏洞利用,针对Android 10 (r33)上的WebP编解码库。展示了libwebp库中的堆缓冲区溢出漏洞,可通过特制的WebP图像实现远程代码执行。

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
查看仓库
131年前尚未审核

root@kitploit:~
     /  \\/  \/  _ \/  _ )/  _ \
     \       /   __/  _  \   __/
      \__\__/\____/\_____/__/ ____  ___
            / _/ /    \    \ /  _ \/ _/
           /  \_/   / /   \ \   __/  \__
           \____/____/\_____/_____/____/v1.0.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

已安装。

注意:一个仅解码的库 libwebpdecoder 可通过 ‘--enable-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、gif2web、img2webp、webpinfo 以及 JS 绑定。

前提条件: 一个编译器(如带 autotools 的 gcc)和 CMake。 在 Debian 类系统上,以下命令应安装最小构建所需的一切: $ sudo apt-get install build-essential cmake

当从 git 源码构建时,您需要运行 cmake 来生成 makefile。

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

如果您还需要任何可执行文件,则需要通过 CMake 启用它们,例如:

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

或通过您喜欢的界面(如 ccmake 或 cmake-qt-gui)。

使用选项 -DWEBP_UNICODE=ON 为 Windows 提供 Unicode 支持(使用 chcp 65001)。

最后,安装后,您还可以通过以下方式在 CMake 项目中使用 WebP:

find_package(WebP)

这将定义 CMake 变量 WebP_INCLUDE_DIRS 和 WebP_LIBRARIES。

Gradle:

对 Gradle 的支持是最低限度的:它仅帮助您编译 libwebp、cwebp、dwebp 和 webpmux_example。

前提条件: 一个编译器(如带 autotools 的 gcc)和 gradle。 在 Debian 类系统上,以下命令应安装最小构建所需的一切: $ sudo apt-get install build-essential gradle

当从 git 源码构建时,您需要用合适的目标运行 Gradle 包装器,例如:

./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 input.png -q 80 -o output.webp 这将使用质量因子 80(0->100 尺度,0 为最低质量,100 为最佳。默认值为 75)将输入文件转换为 WebP 文件。 您可能也想尝试 -lossless 标志,它将在不损失任何信息的情况下压缩源(RGBA 格式)。在这种情况下,-q 质量参数将控制尝试使输出文件尽可能小的处理时间。

更多选项可通过 -longhelp 命令行标志获得:

cwebp -longhelp 用法: cwebp [-preset <...>] [options] in_file [-o out_file]

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

选项: -h / -help ............. 简短帮助 -H / -longhelp ......... 详细帮助 -q ............. 质量因子(0:小..100:大),默认=75 -alpha_q ......... 透明度压缩质量(0..100), 默认=100 -preset ....... 预设设置,可选: default, photo, picture, drawing, icon, text -preset 必须放在首位,因为它会覆盖其他参数 -z ............... 激活无损预设,级别 [0:快, ..., 9:最慢]

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

-s ......... YUV 输入的尺寸(宽度 x 高度) -sns ............. 空间噪声整形(0:关,100:最大),默认=50 -f ............... 滤波强度(0=关..100),默认=60 -sharpness ....... 滤波锐度(0:最锐..7:最不锐),默认=0 -strong ................ 使用强滤波代替简单滤波(默认) -nostrong .............. 使用简单滤波代替强滤波 -sharp_yuv ............. 使用更锐利(且更慢)的 RGB->YUV 转换 -partition_limit . 限制质量以适应第一个分区 512k 限制 (0=无劣化...100=完全) -pass ............ 分析遍数(1..10) -crop .. 用给定矩形裁剪图像 -resize ........ 调整图像大小(在任何裁剪之后) -mt .................... 如果可用则使用多线程 -low_memory ............ 减少内存使用(编码更慢) -map ............. 打印额外信息图 -print_psnr ............ 打印平均 PSNR 失真 -print_ssim ............ 打印平均 SSIM 失真 -print_lsim ............ 打印局部相似性失真 -d <file.pgm> .......... 转储压缩输出(PGM 文件) -alpha_method .... 透明度压缩方法(0..1),默认=1 -alpha_filter . 对 alpha 平面的预测滤波, 可选:none, fast(默认)或 best -exact ................. 保留透明区域中的 RGB 值,默认=关 -blend_alpha ..... 混合颜色与背景色 背景色表示为 RGB 值,以 十六进制书写,例如 0xc0e0d0 表示 red=0xc0 green=0xe0 和 blue=0xd0 -noalpha ............... 丢弃任何透明度信息 -lossless .............. 无损编码图像,默认=关 -near_lossless ... 使用近无损图像 预处理(0..100=关),默认=100 -hint ......... 指定图像特征提示, 可选:photo, picture 或 graph

-metadata ..... 逗号分隔的元数据列表,如果存在则 从输入复制到输出。 有效值:all, none(默认), 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 in_file [options] [-o out_file]

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

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

WebP 文件分析工具:

‘webpinfo’ 可用于打印 WebP 文件的块级结构和比特流头部信息。它还可以检查文件是否为有效的 WebP 格式。

用法:webpinfo [options] in_files 注意:可以有多个输入文件; 选项必须放在输入文件之前。 选项: -version ........... 打印版本号并退出。 -quiet ............. 不显示块解析信息。 -diag .............. 显示解析错误诊断。 -summary ........... 显示块统计摘要。 -bitstream_info .... 解析比特流头部。

可视化工具:

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

用法:vwebp in_file [options]

解码 WebP 图像文件并使用 OpenGL 可视化 选项: -version ..... 打印版本号并退出 -noicc ....... 如果存在则不使用 icc 配置文件 -nofancy ..... 不使用花哨的 YUV420 升频器 -nofilter .... 禁用环路内滤波 -dither 抖动强度(0..100),默认=50 -noalphadither 禁用 alpha 平面抖动 -usebgcolor .. 显示背景色 -mt .......... 使用多线程 -info ........ 打印信息 -h ........... 此帮助信息

键盘快捷键: ‘c’ ................ 切换颜色配置文件的使用 ‘b’ ................ 切换背景色显示 ‘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 [file-level options] [image files...] [per-frame options...]

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

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

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

注意:如果只传递一个文件名作为参数,参数将从该文件中分词。文件名不得以字符 ‘-’ 开头。

动画 GIF 转换:

动画 GIF 文件可以使用 examples/ 下的 gif2webp 工具转换为带有动画效果的 WebP 文件。然后可以使用 vwebp 查看这些文件。

用法: gif2webp [options] 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(默认) -loop_compatibility .... 对 M62 之前(含)的 Chrome 版本使用兼容模式 -mt .................... 如果可用则使用多线程

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

构建:

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

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

动画图像比较:

examples/ 下的测试工具 anim_diff 可用于比较两个动画图像(每个可以是 GIF 或 WebP)。Usage: anim_diff [options]

Options: -dump_frames 将解码帧以 PAM 格式转储到文件夹 -min_psnr ... 每帧最小 PSNR -raw_comparison ..... 若未使用此标志,比较前会对 RGB 进行预乘 -max_diff ..... 后续帧中对应像素间每通道允许的最大差异 -h .................. 此帮助信息 -version ............ 打印版本号并退出

Building:

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

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

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

当然,这种情况下不需要质量因子,因为压缩过程不会丢失输入值,但代价是输出体积更大。

Advanced encoding API:

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

WebPConfig 包含编码设置,不与特定图片绑定。 WebPPicture 包含输入数据,将使用某个 WebPConfig 进行压缩。 编码流程如下:

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

#include <webp/encode.h>

// 设置配置,从预置开始并调整一些附加参数 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 x height 大小的图片 if (!WebPPictureAllocate(&pic)) { return 0; // 内存错误 } // 此时 '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' 结果如何,都必须调用。

// 此时输出数据应由 writer 处理。 // -> 压缩数据是 wrt.mem / wrt.size 描述的内存缓冲区

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

-------------------------------------- END PSEUDO EXAMPLE

Decoding API:

主要只需调用一个函数:

#include "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); 使用该函数时不涉及解码。

Incremental decoding API:

当数据逐步传输时,仍可使用稍复杂的 API 进行增量解码。解码器状态存储在 WebPIDecoder 对象的实例中。可以创建该对象用于解码 RGB 或 Y'CbCr 样本。例如:

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

随着数据逐步可用,此增量解码器对象可用于进一步解码图片。有两种(互斥的)方式传递新到达的数据:

要么追加新字节:

WebPIAppend(idec, fresh_data, size_of_fresh_data);

要么仅提及传输数据的新大小:

WebPIUpdate(idec, buffer, size_of_transmitted_buffer);

请注意,每次调用 WebPIUpdate 之间可以修改 'buffer',特别是当调整缓冲区大小以容纳更大数据时。

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

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

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

最后,请注意,解码也可以直接进入预分配的像素缓冲区。该缓冲区必须在创建 WebPIDecoder 时通过调用 WebPINewRGB() 或 WebPINewYUVA() 传入。

请参阅 src/webp/decode.h 头文件以了解更多细节。

Advanced Decoding API:

WebP 解码支持高级 API,提供即时裁剪和缩放功能,这在内存受限环境(如手机)中非常有用。基本上,如果只需要快速预览或放大查看过大的图片的一部分,内存使用量将随输出大小而非输入大小缩放。同时也能节省一些 CPU。

-------------------------------------- BEGIN PSEUDO EXAMPLE // A) 初始化配置对象 WebPDecoderConfig config; CHECK(WebPInitDecoderConfig(&config));

root@kitploit:~
 // B) 可选:检索比特流特征。
 CHECK(WebPGetFeatures(data, data_size, &config.input) == VP8_STATUS_OK);

 // C) 如有需要,调整 'config' 选项
 config.options.no_fancy_upsampling = 1;
 config.options.use_scaling = 1;
 config.options.scaled_width = scaledWidth();
 config.options.scaled_height = scaledHeight();
 // 等等。

 // D) 指定 'config' 输出选项以指定输出色彩空间。
 // 也可以选择指定外部图像解码缓冲区。
 config.output.colorspace = MODE_BGRA;
 // 可选地,config.output 可以指向外部缓冲区以解码图像。
 // 此外部提供的内存缓冲区应足够大以存储解码后的图片。
 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) 解码 WebP 图像。关于解码图像有两种变体。
 // 第一种 (E.1) 解码完整图像,第二种 (E.2) 用于使用小输入缓冲区增量解码图像。
 // 可使用其中任一步骤解码 WebP 图像。

 // E.1) 解码完整图像。
 CHECK(WebPDecode(data, data_size, &config) == VP8_STATUS_OK);

 // E.2) 增量解码图像。
 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) 解码后的图像现在位于 config.output(以及 config.output.u.RGBA)中。
 // 可以保存、显示或以其他方式处理。

 // G) 回收 config 对象中分配的内存。即使内存是外部的且不是由 WebPDecode() 分配的,
 // 调用此函数也是安全的。
 WebPFreeDecBuffer(&config.output);

-------------------------------------- END PSEUDO EXAMPLE

Bugs:

请将所有错误报告提交到问题跟踪器: https://bugs.chromium.org/p/webp 欢迎提交补丁!请参阅此页面开始: http://www.webmproject.org/code/contribute/submitting-patches/

Discuss:

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

下载工具