2026-10-27
带透明通道的 PNG 压缩会以一种特定的方式翻车:文件变小了,透明区域还在,logo 看着还是坏的,因为边缘多了一圈灰边。透明 png 压缩比其他图片麻烦,是因为除了 RGB 之外还多了一个 alpha 通道,而很多省体积的手法正好作用在边缘上。这篇讲清 PNG-8 和 PNG-32 怎么选、哪些数据块能删、以及边缘怎么保住。
不带透明的 PNG 每像素存 RGB 三个值,带透明就多一个 alpha,文件体积的上限直接抬高。这也是为什么同一个 logo,去掉背景之后反而变大。
PNG 用的是 deflate,本身就是无损算法,所以无损压缩在这里指的是不改任何一个像素值,只换一种更省字节的存法。降调色板、减颜色数都属于有损,因为它们真的改了像素。
PNG 由若干 chunk 组成,其中一部分跟渲染无关。
命令行做法:pngcrush -rem alla -reduce in.png out.png,或者 oxipng -o 4 --strip safe in.png。在线工具里选 strip metadata 也有同样效果。
抗锯齿让边缘像素处于半透明状态,这些像素的颜色是按原始背景混好的。量化到调色板时,如果工具把半透明像素当成实色处理,压完贴到深色底上就会出现一圈浅色描边。
和其他格式的取舍在 /blog/png-vs-jpg-differences。针对 PNG 的完整对比见 /blog/compress-png-without-losing-quality。广告位这类有硬性 KB 限制的场景见 /blog/compress-images-facebook-ads-2026,矢量图标的处理方式完全不同,参看 /blog/compress-svg-without-breaking。
无损流程不会。会丢透明的是转成 JPG 或者导出时没勾选透明通道这两种情况,PNG 到 PNG 的处理不涉及格式转换。
看内容。纯色 logo、图标、单色插画用 PNG-8,体积常常只有四分之一。带阴影、渐变、半透明叠加的内容用 PNG-32,量化之后会出现色带。
半透明像素在量化时被当成实色处理了。用支持预乘 alpha 的工具重压一次,或者退回 PNG-32 走无损路线。
只做删数据块和重排 deflate,通常 10% 到 30%。设计软件导出的文件元数据多,能到 30%;已经优化过的文件剩 5% 左右。要更大降幅就得改颜色数,那是另一回事。