cwebp 是 libwebp 官方给的命令行转换器,753664 字节的单文件 exe,把 PNG / JPEG / TIFF 转成 WebP。它不带批量功能,也没有图形界面,一次处理一个文件,批量靠外面的循环脚本。
拿 30 张 1080p 视频帧和 15 张界面截图做实测。同一个工具,两种图的最优参数完全不一样:照片类素材 q75 就够,界面截图宁可上无损。
单个 exe,输出带压缩明细
cwebp -version
1.6.0
libsharpyuv: 0.4.2
cwebp -q 80 card.png -o card.webp
Saving file 'card.webp'
File: card.png
Dimension: 1200 x 675
Output: 36934 bytes Y-U-V-All-PSNR 42.87 46.89 46.21 43.62 dB
(45.44 bpp)
compression: 41%
每次转换都会打印 Y/U/V 三个通道的 PSNR 和最终体积、压缩率。要做质量对比,看这个 PSNR 比肉眼判断靠谱:42.87 dB 这一档基本看不出差别,再往下数字掉得多,块状伪影就出来了。
这个 exe 是 753664 字节,依赖的 libwebp 已经静态链进去,不用另装 DLL。
30 张 1080p 帧,q 值扫一遍
素材是从 30 秒 1080p 视频里每秒抽一帧,30 张 PNG 共 9473498 字节。逐档转一遍:
| 档位 | 总耗时 | 输出体积 | 体积下降 | 单张耗时 |
|---|---|---|---|---|
| q75 | 7.96 秒 | 1454306 字节 | 84.6% | 265.4 毫秒 |
| q80 | 7.87 秒 | 1660200 字节 | 82.5% | 262.2 毫秒 |
| q90 | 8.03 秒 | 2188984 字节 | 76.9% | 267.6 毫秒 |
| q100 | 8.30 秒 | 3559694 字节 | 62.4% | 276.7 毫秒 |
| 无损 | 101.85 秒 | 5996104 字节 | 36.7% | 3395.2 毫秒 |
| q100 相对 q75 | 1.04 倍 | 2.45 倍 | — | — |
| q100 相对 q75 的耗时增幅 | 4.3% | — | — | — |
| 无损相对 q75 | 12.8 倍 | 4.12 倍 | — | — |
| cwebp exe 体积 | 753664 字节 | — | — | — |
| 素材总字节 | 9473498 字节 | — | — | — |
q 从 75 爬到 100,耗时只多 4.3%(7.96 秒到 8.30 秒),体积却涨到 2.45 倍。也就是说在这个区间里,时间几乎不要钱,体积才是要付的账。
无损那一档是另一个故事:101.85 秒,是 q75 的 12.8 倍,换来的体积仍比 q75 大 4.12 倍。对视频帧这类颜色连续的素材,无损基本没有性价比。
界面截图反过来
换成 15 张界面截图,共 1372552 字节。这类图大面积是纯色,边缘是锐利的文字,情况和视频帧完全不同:
| 档位 | 总耗时 | 输出体积 | 体积下降 | 单张耗时 |
|---|---|---|---|---|
| q75 | 2.63 秒 | 267218 字节 | 80.5% | 175.3 毫秒 |
| q80 | 2.58 秒 | 306366 字节 | 77.7% | 171.9 毫秒 |
| q90 | 2.56 秒 | 422516 字节 | 69.2% | 170.5 毫秒 |
| q100 | 2.60 秒 | 663698 字节 | 51.6% | 173.5 毫秒 |
| 无损 | 24.29 秒 | 999956 字节 | 27.1% | 1619.6 毫秒 |
| 无损相对 q100 | 9.35 倍 | 1.51 倍 | — | — |
| 截图素材总字节 | 1372552 字节 | — | — | — |
无损把 1372552 字节压到 999956 字节,压掉 27.1%,文字边缘完全不变形。这个降价幅度对截图来说很实在:PNG 本来就接近无损,换成 WebP 无损还能再省四分之一,而且像素一模一样。
如果这些截图要放在网页正文里给别人看,q90 是更实际的选择,422516 字节比原始少 69.2%,文字仍然清楚。无损那 24.29 秒用在几十张图上就是几分钟,只在需要逐像素比对时才值得。
单文件没有批处理,得自己套循环
cwebp 一次只吃一个输入文件,-o 指定输出。批量要么用 for 循环,要么用 find 配合 -exec:
for %f in (*.png) do cwebp -q 80 "%f" -o "%~nf.webp"
find . -name "*.png" -exec cwebp -q 80 {} -o {}.webp \;
注意 %~nf 只取文件名不带扩展名,直接写 %f.webp 会得到 a.png.webp。这个细节在 Windows 的 for 语法里容易忽略。
还有一个坑:目标文件已存在时 cwebp 不会问,直接覆盖。批处理里跑错一次,原图对应的旧 webp 就没了。
什么时候不该用它
WebP 在浏览器里的支持已经很完整,但它不适合做所有事。需要透明通道的动图、需要被老软件读取的素材、需要无损保留高动态范围的内容,这几种情况 WebP 都不是最优解。
另外压缩率不是越高越好。同一批 1080p 帧,q75 的 1454306 字节已经很接近肉眼极限,再往下降到 q50 会出现明显的色块,尤其在渐变的天空和暗部。判断标准是看 cwebp 打印的 PSNR,低于上面那张卡片上的 42.87 dB 就该重新挑参数。
真正省事的做法是先拿三五张代表性素材试三档,选出体积和质量都能接受的那一档,再对全量跑。全量跑一次 30 张要 8 秒,试错成本很低。










