搜「PNG 压缩」,排在前面的工具都说自己「无损」「画质不变」,压缩率却能差出好几倍:有的省 70%,有的只省 10%。
差别不在谁的算法更神奇,而在于:它们说的「无损」根本不是同一件事。
这篇文章先讲清楚这个区别,再按使用场景推荐工具。
先分清:两种「无损」
真无损:像素一个都不变
PNG 本身就是无损格式,它的体积由两部分决定:像素数据怎么排列、怎么用 Deflate 压缩,以及文件里夹带了多少元数据。
真无损压缩只在这两处下功夫:
- 换一种更省空间的存法。比如图里实际只用了 200 种颜色,就改用调色板模式;没有半透明,就去掉 Alpha 通道;灰度图就按灰度存。
- 尝试更好的过滤器和 Deflate 参数。同样的像素,编码方式不同,压出来的大小可以差不少。设计工具导出 PNG 时追求速度,通常不会认真尝试。
- 去掉元数据。导出软件信息、时间戳、文字注释、缩略图等。
压完的图解码出来,和原图逐像素完全相同。代价是省得不多——它只能挤掉「编码不够认真」的那部分水分。
「看起来无损」:其实是有损量化
TinyPNG、pngquant 这类工具省得多,是因为它们做了另一件事:把 PNG 的颜色数量降到 256 色以内(量化),再配合抖动让肉眼看不出来。
这是有损的,像素已经变了。对大部分网页图标、插画来说效果很好,也很值得用;但如果你需要的是「像素绝对不变」——比如 UI 切图要和设计稿严格一致、截图要做像素级比对、素材之后还要再编辑——就不该用它。
判断一个工具是不是真无损,最简单的办法:压缩前后用 ImageMagick 比一下
compare -metric AE 原图.png 压缩后.png null:
输出0就是一个像素都没变。
真无损 PNG 工具推荐
命令行:oxipng(首选)
oxipng 是用 Rust 写的 PNG 无损优化器,可以看作老牌工具 OptiPNG 的现代继任者:
- 多线程,速度快,适合批量处理。
-o 0到-o 6(以及-o max)调节压缩力度,等级越高越慢、省得越多。- 可选
--zopfli进一步压缩,但会慢很多。 - Squoosh 的 PNG 无损压缩,用的就是它。
bash
brew install oxipng
oxipng -o 2 --strip safe -r ./images # 递归处理目录,只去掉不影响显示的元数据
命令行:zopflipng(追求极限体积)
Google 出品,用 Zopfli 算法重做 Deflate 压缩,通常能比 oxipng 默认等级再挤出一点,但速度慢得多,大图可能要跑很久。适合「压一次、用很久」的静态资源,比如网站 Logo、App 内置图标。
命令行:OptiPNG、pngcrush(老牌)
两者都是经典的无损 PNG 优化器,很多工具链里还能见到它们。功能上已经被 oxipng 基本覆盖,新项目没必要专门选它们。
网页:Squoosh
Google 的在线工具,PNG 选 OxiPNG 编码器即为无损(注意别勾选「Reduce palette」,那一项是有损减色)。
优点是免安装、可以左右对比;缺点是一次只能处理一张,下载回来还要自己改名、替换。适合偶尔压一两张。
Mac 图形界面:ImageOptim
开源免费的老牌 Mac 工具,内部整合了 oxipng、Zopfli、pngcrush 等多个优化器,轮流尝试取最小结果。默认是无损模式(有损选项需要手动开启)。
它压缩力度大,但开满所有优化器时速度偏慢;而且是直接覆盖原文件,压之前最好自己备份一份。
Mac 图形界面:ImgZilla
ImgZilla 是我们做的 macOS 图片压缩工具。它处理 PNG 的方式很直接:
- 用 oxipng 做真无损压缩,压缩等级为 2(和 Squoosh 默认一致),在速度和体积之间取平衡。像素一个都不变,可以用上面的
compare命令验证。 - 不做量化、不减色、不转格式、不改尺寸。PNG 压完还是 PNG。
- 原地压缩:文件名和路径不变,代码、文档里的引用都不用改。
- 整个文件夹拖进去即可:递归扫描子目录,自动跳过隐藏文件和
node_modules;JPG、GIF、WebP、HEIC、AVIF、SVG 也能一起处理。 - 原图默认移入废纸篓,不满意就右键「放回原处」。
- 压不动的不硬压:压缩率不足 0.4% 的文件标为「已最小」,原样保留,也不扣免费额度。
- 全程本地运行,素材不上传任何服务器。
有两点需要说清楚:
- 它不追求 PNG 的极限体积。等级 2 比
-o max或 Zopfli 快得多,代价是可能少省几个百分点。如果你的需求是「把一个 Logo 压到最后一个字节」,zopflipng 或 ImageOptim 更合适。 - 默认会去掉 PNG 里的全部元数据,包括颜色配置文件。普通 sRGB 图片不受影响;但如果图里嵌了 Display P3 等广色域配置(Mac 截图、设计软件导出时常见),去掉后在色彩管理的软件里颜色可能略有变化。对颜色要求严格的图,可以在设置里打开「保留 EXIF 信息」,元数据就会原样保留。
一张表总结
| 工具 | 类型 | 是否真无损 | 批量 | 适合谁 |
|---|---|---|---|---|
| oxipng | 命令行 | ✅ | ✅ | 开发者、构建流程 |
| zopflipng | 命令行 | ✅ | 需自己写脚本 | 追求极限体积、不在乎速度 |
| OptiPNG / pngcrush | 命令行 | ✅ | ✅ | 老项目沿用 |
| Squoosh | 网页 | ✅(OxiPNG,不勾减色) | ❌ 一次一张 | 偶尔压一两张 |
| ImageOptim | Mac 应用 | ✅(默认) | ✅ | 想要最大压缩力度的 Mac 用户 |
| ImgZilla | Mac 应用 | ✅ | ✅ 拖文件夹 | 想批量压、不想改路径、要能反悔 |
| TinyPNG / pngquant | 网页 / 命令行 | ❌ 有损量化 | 视版本而定 | 能接受减色、追求更高压缩率 |
怎么选
- 只要像素不变、愿意敲命令:oxipng,写进构建脚本,一劳永逸。
- 要把单个文件压到极限:zopflipng。
- Mac 上图形化批量处理:ImageOptim 力度更大;ImgZilla 速度更快、原图可从废纸篓找回、还能顺带处理其他格式。
- 能接受轻微有损、想要更小:TinyPNG / pngquant,但要清楚这已经不是无损了。
最后提醒一句:无损压缩省多少,取决于 PNG 原来是怎么导出的。设计工具直接导出、从没处理过的 PNG,往往有不少水分;已经被优化过的 PNG,再压也挤不出多少——工具显示「已最小」,说明它已经很好了,不是工具不行。
ImgZilla 目前仅支持 macOS(12.3 及以上),可在 Mac App Store 下载。免费版每天可压缩 10 张,只有压缩成功才计入额度——拖一个装满 PNG 的文件夹进去,再用
compare验证一下像素是不是真的没变。
