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 字节。逐档转一遍:

档位总耗时输出体积体积下降单张耗时
q757.96 秒1454306 字节84.6%265.4 毫秒
q807.87 秒1660200 字节82.5%262.2 毫秒
q908.03 秒2188984 字节76.9%267.6 毫秒
q1008.30 秒3559694 字节62.4%276.7 毫秒
无损101.85 秒5996104 字节36.7%3395.2 毫秒
q100 相对 q751.04 倍2.45 倍——
q100 相对 q75 的耗时增幅4.3%———
无损相对 q7512.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 字节。这类图大面积是纯色,边缘是锐利的文字,情况和视频帧完全不同:

档位总耗时输出体积体积下降单张耗时
q752.63 秒267218 字节80.5%175.3 毫秒
q802.58 秒306366 字节77.7%171.9 毫秒
q902.56 秒422516 字节69.2%170.5 毫秒
q1002.60 秒663698 字节51.6%173.5 毫秒
无损24.29 秒999956 字节27.1%1619.6 毫秒
无损相对 q1009.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 秒,试错成本很低。