pngquant 两档质量后接 oxipng,每步省多少花几秒

0 阅读6分钟

pngquant 的 --quality 要填一个区间,我手边就拿 65-80 和 80-95 两档各跑一遍。后面再接 oxipng 和 zopflipng。想看的是每一步多省了多少、多花了几秒。样本是 12 张 PNG,分截图、图标、插画、照片四类,每类 3 张,全部取自维基共享资源,CC 许可,作者署名放在文末。

先交代这批图和命令

机器是 Apple M4、macOS 26.5.2。工具是 pngquant 3.0.3、oxipng 10.2.1 和 zopflipng(zopfli 1.0.3_1)。跑在 2026-10-29。每张图每个步骤我只跑了一次。耗时是单次墙钟,三张合计。图标类特别小,只有 23 KB 到 120 KB,百分比抖得厉害。下面的结论只对这 12 张、这台电脑、这几个参数成立。命令很短。先用 pngquant 减色,再把输出复制一份交给 oxipng。80-95 那一档只是把区间换掉。下面是图标类里一张 40,369 字节的图,输出是我本机的真实结果,IN 和 Q 是占位名。

$ 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

这张图从 40,369 字节减到 7,600,再被 oxipng 压到 6,954。12 张里两档质量都没有触发「低于下限就不输出」,命令记录里没有 exit=99。每一张都真被减色了。

减色一步就省掉六成以上

先看 pngquant 自己干了多少。65-80 这一档,截图省 68.2%。图标省 79.8%。插画省 75.3%。照片省 66.3%。80-95 保留的颜色更多,四类分别是 67.2%、76.5%、70.1%、64.2%。耗时很轻,三张合计只要 0.14 到 0.40 秒。两档差距不大。截图只差一个百分点。插画差 5.2 个百分点,是四类里拉得最开的。画质我没有逐张比过,这里只比体积。

再接 oxipng 多省的是个位数百分点

下表每格是累计省多少,相对该类原始体积。括号里是 oxipng 这一步自己的耗时。

类原始字节65-80 减色再 oxipng80-95 减色再 oxipng
截图1,890,08968.2%70.1%(1.56 秒)67.2%69.1%(1.68 秒)
图标184,13779.8%82.9%(0.85 秒)76.5%79.7%(0.91 秒)
插画316,99375.3%76.9%(1.35 秒)70.1%72.4%(1.35 秒)
照片2,063,19266.3%70.3%(0.80 秒)64.2%70.3%(0.83 秒)

65-80 这一档,oxipng 多省的是截图 1.9、图标 3.1、插画 1.6、照片 4.0 个百分点。这一步三张合计花 0.80 到 1.56 秒。不算久。80-95 那一档多省的是截图 1.9、图标 3.2、插画 2.3、照片 6.1 个百分点。照片类最明显。65-80 减色后是 694,735 字节,再 oxipng 到 612,968。80-95 减色后是 738,097 字节,再 oxipng 到 613,199。两档在 pngquant 单独跑时差了四万多字节,过了 oxipng 只剩 231 字节。这个现象我只在 12 张里见到,不外推。照片类为什么收益最高,我没有去查。截图、图标、插画三类没有这种收敛。80-95 一档最后仍然比 65-80 大。插画类差了 14,266 字节(87,477 对 73,211)。

下面这张散点图把每类、每种组合的累计省多少和累计耗时放在一起。横轴是对数,三角形是 pngquant 单独,菱形是 65-80 加 oxipng。

四类 PNG 在七种处理组合下的累计节省比例与累计耗时散点图

这张图要看两处。左上角那一簇三角形和倒三角,都在 0.5 秒以内,已经省到 64% 以上。往右走到 1 到 2 秒的菱形和叉号,纵坐标只高出一小截。样本取自维基共享资源,CC 许可,图内页脚已写明。

zopflipng 多花十几秒几乎不再省

我顺手把 zopflipng 也接在 pngquant 后面跑了一遍。65-80 之后再跑,四类各自多省的只在 0.0 到 0.5 个百分点之间,几乎看不出差别。耗时却要三张合计 3.46 到 19.52 秒,截图类最慢。对照 oxipng 的 0.80 到 1.56 秒,这一步的性价比明显低。话要说准。zopflipng 我用的是快速模式。参数是 -q -y --filters=01234mepb,没有加 -m。oxipng 一步同时做了位深和调色板的无损缩减,zopflipng 在这组参数下只重压 deflate。这个结果不代表 zopfli 算法本身比 oxipng 差。去掉 -q 的完整模式在这组对照里没放。

先无损再减色等于白跑

顺序是我最想确认的一件事。把 oxipng 放在 pngquant 前面跑,65-80 一档的最终体积几乎等于 pngquant 单独的体积。照片是 694,253 对 694,735,只差 482 字节,截图两者都是 601,760。先 zopflipng 再 pngquant 也是同样的结果。我的推测是 pngquant 会把图像重新编码输出。前面做的 deflate 优化基本被丢掉。这只是从表现猜的,没看过它的实现。想省就先减色后无损。反过来前面那一步没有收益。

调色板 PNG 输出还能再压一轮

这次批量压缩我用的是图映 ImgIng(imging.cn/),把同样 12 张用「统一输出 PNG」跑了一遍。输出并不都是调色板 PNG。只有图标 3 张和 Anime girl 1 张是调色板输出。另外 7 张是 RGBA,输出比原图还大,最多的一张大了 65.4%。还有 1 张因为位深高被保留原件。官网写的是即使变大也保留转换结果并标注,界面上确实标了「体积增加」。拿那 4 张调色板输出各再跑一次 oxipng,体积又掉了一截。

文件图映输出(字节)再 oxipng(字节)多省
Adaptability icon9,3466,30132.6%
Afro Mobile icon8,3245,94628.6%
Anime girl90,04061,74831.4%
Blue star icon43,21623,57145.5%

多省的比例是相对图映输出算的,范围 28.6% 到 45.5%。这说明批量输出的调色板 PNG 还有无损空间。只有 4 张、单次。不写成普遍结论。同一批原图直接走 pngquant 65-80 再 oxipng,Adaptability 是 6,954 字节,Afro 是 3,823,Blue star 是 20,719,Anime girl 是 50,468。颜色数不同。画质也没比。这两组数字不能直接拿来评谁更好。

这批数字只代表这 12 张

范围再说一遍:12 张图,每类 3 张,一台 M4 的电脑,每步单次。耗时是墙钟,没有排除磁盘和系统波动。

样本署名

样本全部取自维基共享资源(Wikimedia Commons),CC 许可或公有领域,作者按 Commons 元数据列出。

文件许可作者
2011_Talend_MDM_studio.pngCC BY-SA 3.0Copyleft
2019-06-19_OpenProject_by_Benoit_Soubeyran.pngCC BY-SA 4.0Mazuritz
2020-06-29_Screenshot_The_Book_Fort_Monmouth_-_Fort_Montagu.pngCC0Stefan Kühn
Adaptability_icon.pngCC0作者未知
Afro_Mobile_Icon.png公有领域Ben plc
Blue_star_icon_stylized.pngCC0PrazerCambraia
Anime_girl_publicdomainq.pngCC0oksmith
Apple_cartoon_with_transparent_background.pngCC0Toby8991
Adenosine_triphosphate_ball-and-stick.pngCC0FreeCliparts
Alekszej_Fedoricsev.pngCC0Javelin Bayraktar
Directiva_junto_a_presidente_APPA.pngCC BY-SA 4.0JaimeRuix
Steve_Selvin.pngCC BY 4.0UC Berkeley Public Health

照这批结果我会这么排

批量处理 PNG,我会先 pngquant 再 oxipng -o 4 --strip safe。zopflipng 只留给文件少、不赶时间的场合。两档质量选哪一档,看你愿意为多少颜色付多少体积。照片类过了 oxipng 两档几乎一样。截图和插画还是 65-80 更小。想判断自己那批图值不值得多跑一步,就先拿每类三张样本按上面的命令跑一遍,再对照表里的收益。