假设手上有两百多张 PNG 商品图要压。TinyPNG 官网写的是一次 20 张、每张 5 MB(2026-10-29 查阅),两百张就得拆十批再一批批下载。这种量直接在本机跑命令更省事,也能写进构建流程。零散的图可以用图映 ImgIng 的批量压缩(imging.cn/),在电脑浏览器里选整… pngquant 加 oxipng 这套命令行组合。下面的做法都来自我在 12 张 PNG 上的实跑,做法之外的部分我会直接标成假设。
第一步先用 pngquant 减色
pngquant 干的是有损的事。它把真彩色缩成最多 256 色的调色板再配上抖动。我用的参数是 --quality=65-80。意思是画质估分落在 65 到 80 之间才输出而低于 65 就放弃这张。--speed 4 是速度和压缩率之间的折中。别的档我没试过,而 12 张图里这个下限一次都没触发。颜色特别多的渐变图会怎么被拒绝我并不知道。这一点只能算假设。真要批量跑我会先在脚本里把退出码打出来。
第二步再用 oxipng 无损重压
减完色的文件还能再压。再跑一遍 oxipng,它只重排滤波器和重压数据。像素一个不变。我这次用的是 -o 4 --strip safe,后一个参数只去掉不影响显示的辅助块。下面是一张 40,369 字节的图标走完两步的完整输出,文件名换成了占位名。
$ pngquant --quality=65-80 --speed 4 --force --output Q.png IN.png; echo exit=$?
exit=0
$ cp Q.png Q_ox.png; oxipng -o 4 --strip safe Q_ox.png
Files processed: 1/1
Input size: 7.42 KiB (7600 bytes)
Output size: 6.79 KiB (6954 bytes)
Total saved: 646 bytes (8.50%)
exit=0
$ ls -l (bytes)
40369 IN.png
7600 Q.png
6954 Q_ox.png
40,369 字节到 7,600 字节是 pngquant 的功劳,再到 6,954 字节是 oxipng 的功劳。第二步单看只有 646 字节,但它是白拿的,因为像素不动而且耗时不到一秒。批量的话把这两条套进 for 循环就行。这个循环我没有单独再跑一遍,在这里只算做法。
十二张图上多省了多少
我按截图、图标、插画、照片各取 3 张一共 12 张,每步各跑一次。pngquant 65-80 单独就省了 66.3% 到 79.8%,这是大头。再跑 oxipng 并按各类原始体积算又多省了 1.6 到 4.0 个百分点,每类 3 张合计多花 0.8 到 1.6 秒。拿照片这一类举例,3 张合计 2,063,192 字节,经过 pngquant 之后剩 694,735 再 oxipng 到 612,968,多出来的 8 万字节差不多是原体积的 4 个点。插画最少,只多省了 1.6 个点。
为什么照片多而插画少我没去查。这批图里是这样,别当规律用。我还顺手跑了 zopflipng,参数是 -y --filters=01234mepb 没加迭代次数是想看看慢工出细活到底值不值。它在 pngquant 之后多省的只有 0.0 到 0.5 个点。每类要花 3.5 到 19.5 秒。这是这组参数下的结果。更高的迭代次数我没试过。不能说 zopfli 本身不行。
顺序反过来基本白跑
有人会想先把无损的收益吃掉最稳,我把顺序反过来试了,结果几乎没变化。照片先 oxipng 再 pngquant 是 694,253 字节,单跑 pngquant 是 694,735,只差 482 字节。我猜 pngquant 会整张重新编码并把前面压好的数据丢掉。这只是猜测而源码我没看。能确认的只有现象:想省体积就先减色后无损。
图映批量输出的调色板图也能接着压
前面提到图映的批量压缩,我另外试过它的「统一输出 PNG」处理同样 12 张。这个模式下有 7 张输出比原图还大,界面会标出体积增加。1 张因为位深高直接保留了原件。剩下 4 张变小,输出的正好是调色板 PNG,3 张图标加 1 张插画。
我把这 4 张再丢给 oxipng,又省了 28.6% 到 45.5%(相对图映的输出)。比如 Blue star 图标从 43,216 字节到 23,571 字节。图映单张页的颜色数滑杆我没有逐张驱动。这个数只代表批量统一 PNG 这条路上的 4 张图,样本很小。
这套做法还有哪些没验证
样本是维基共享资源上的 CC 许可 PNG。不是手机直出或设计稿导出的图。耗时是在这台 Apple M4 上单次测的,换机器会变。pngquant 是有损的,我只比了体积,没做画质对比。客户图能不能接受 256 色,得自己看过再批量跑。比较稳的做法是先挑 5 张有代表性的图用上面两条命令跑一遍,肉眼对着原图看渐变和边缘再套循环。TinyPNG 的 20 张限制我只查了官网页面而没有实际上传测过,也就不拿它当对比数据。上面所有体积都是命令行跑出来的。