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

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 是占位名。

ini 复制代码
$ 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 减色 再 oxipng 80-95 减色 再 oxipng
截图 1,890,089 68.2% 70.1%(1.56 秒) 67.2% 69.1%(1.68 秒)
图标 184,137 79.8% 82.9%(0.85 秒) 76.5% 79.7%(0.91 秒)
插画 316,993 75.3% 76.9%(1.35 秒) 70.1% 72.4%(1.35 秒)
照片 2,063,192 66.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。

这张图要看两处。左上角那一簇三角形和倒三角,都在 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 icon 9,346 6,301 32.6%
Afro Mobile icon 8,324 5,946 28.6%
Anime girl 90,040 61,748 31.4%
Blue star icon 43,216 23,571 45.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.png CC BY-SA 3.0 Copyleft
2019-06-19_OpenProject_by_Benoit_Soubeyran.png CC BY-SA 4.0 Mazuritz
2020-06-29_Screenshot_The_Book_Fort_Monmouth_-_Fort_Montagu.png CC0 Stefan Kühn
Adaptability_icon.png CC0 作者未知
Afro_Mobile_Icon.png 公有领域 Ben plc
Blue_star_icon_stylized.png CC0 PrazerCambraia
Anime_girl_publicdomainq.png CC0 oksmith
Apple_cartoon_with_transparent_background.png CC0 Toby8991
Adenosine_triphosphate_ball-and-stick.png CC0 FreeCliparts
Alekszej_Fedoricsev.png CC0 Javelin Bayraktar
Directiva_junto_a_presidente_APPA.png CC BY-SA 4.0 JaimeRuix
Steve_Selvin.png CC BY 4.0 UC Berkeley Public Health

照这批结果我会这么排

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

相关推荐
费曼学习法1 小时前
无人值守AI内容矩阵实战(10):Windows 无 systemd,进程存活率 99% 怎么做
前端
小兔子1 小时前
Integer 的 == 在 100 时是 true,在 1000 时是 false
前端
尘世中一位迷途小书童1 小时前
和 AI 打交道会撞见的一整串词:从大模型到 Agent、RAG、MCP、Skill,一次串清
前端·人工智能
lusklusklusk1 小时前
Python 全局变量与局部变量区别——global 关键字、__main__ 块与作用域示例
开发语言·前端·python
产品经理爱开发2 小时前
AxureShow(艾可秀)国内通用的html托管
前端·人工智能·html·ai编程
jktantan2 小时前
前端也需要事务:Vue Router 乐观更新、回滚与“过期事务”
前端·javascript·vue.js
怕浪猫2 小时前
K3.1 直追 Astra,先补 13%
前端·javascript·面试
天若有情6732 小时前
【前端趣味项目】把防抖玩出新花样!一个带隐藏后门的毫秒级“读秒挑战”
前端·javascript·html·防抖·外挂·趣味demo·读秒挑战
Liben2 小时前
Weex开发踩坑记录
android·前端·ios