PNG 为什么压不小?PNG8 减色压缩原理与实操
PNG 是无损格式,调质量对它没有意义
很多人第一次用压缩工具,会下意识去找那个 0 到 100 的质量滑杆,拉到 60,期待 PNG 体积掉下来。结果体积几乎没变,画质也没有可见变化。这不是工具坏了,而是 JPEG 与 PNG 的压缩模型根本不同。
JPEG 是有损格式。它把图像切成 8×8 小块,做离散余弦变换,再按量化表丢掉高频信息。人眼对亮度细节敏感、对色度细节迟钝,被丢掉的恰好是感知上不重要的部分。质量滑杆控制的就是量化表的粗细:数值越低,丢得越多,体积越小,块状伪影越明显。
PNG 则完全不同。它先做预测,让每行像素参考左边、上边或左上角的像素,再把预测残差交给 DEFLATE 做无损熵编码。整个过程可逆,解码后能一个比特不差地还原原图。既然没有丢信息这个环节,也就没有质量参数可调。对 PNG 来说,无损压缩比的是内容的规律性:大片纯色、重复图案压缩率高;噪点密集、色彩细腻的图像压缩率低。
PNG 压缩没有质量滑杆。想让 PNG 显著变小,只有三条路:减少颜色数、降低分辨率、换格式。前两条是 PNG 内部优化,第三条属于 JPEG 与 WebP 的地盘。
索引色与真彩色:PNG8、PNG24、PNG32 差在哪
真彩色(PNG24)每个像素存 RGB 三个通道各 8 位,能表达约 1677 万种颜色,没有调色板。加上 8 位 alpha 通道就是 PNG32,支持 256 级半透明。照片、复杂渐变、需要柔和边缘的素材都靠它。
索引色(PNG8)引入一张调色板:图像里出现过的每种颜色登记一次,最多 256 条,每个像素只存一个 0 到 255 的索引。每像素从 24 位降到 8 位,原始数据本身就缩到约三分之一,而调色板只占几百字节。更关键的是索引值局部重复度高,DEFLATE 还能再压一层,所以整体体积常能降到原来的两到四成。
| 类型 | 每像素位数 | 颜色上限 | 透明支持 | 适用场景 |
|---|---|---|---|---|
| PNG8(索引色) | 8 位 | 256 色 | 单色透明或调色板 alpha | 图标、UI 素材、扁平插画、截图 |
| PNG24(真彩色) | 24 位 | 约 1677 万色 | 无 alpha | 照片、复杂图像 |
| PNG32(真彩色加 alpha) | 32 位 | 约 1677 万色 | 256 级半透明 | 需要柔和边缘的透明素材 |
调色板与抖动:减色到底发生了什么
把真彩色转成索引色,本质是一个聚类问题:把成千上万种颜色归并到 256 个或更少的代表色里。常见做法是统计颜色频率,用中位切分或 k-means 一类算法切分颜色空间,每簇取一个代表色写进调色板,再把每个像素映射到最近的代表色。
映射会带来色带:原本平滑的渐变被切成若干层。为了掩盖断层,压缩器使用抖动。最经典的是 Floyd-Steinberg 误差扩散,一个像素被量化后,它与原色的误差按比例分摊给右侧和下方的邻居,让局部平均颜色更接近原图。视觉上是细密噪点,远看过渡自然,近看有颗粒。
抖动是双刃剑。它改善了观感,代价却是破坏区域内颜色一致性。原本一大片同色区域,抖动后每个像素值都不同,DEFLATE 再也找不到重复模式,体积明显反弹,有时甚至比不减色还大。所以工具通常提供无抖动、弱抖动、强抖动选项,默认给较低强度。
判断标准很简单:素材越接近色块加硬边缘,抖动越不必要,减色收益越大;素材越依赖平滑过渡,抖动越必要,但减色收益也越小。
哪些 PNG 适合减色,哪些不要碰
减色的前提是图像本身用不到那么多颜色。
适合减色的:
- 图标与 favicon:通常只有几种颜色,减到 16 色甚至 8 色都看不出差别。
- UI 素材与控件:按钮、边框、阴影大多来自有限色板。
- 扁平插画:设计师本来就在用固定配色,颜色数天然低于 64。
- 截图:文档、代码、表格、聊天界面这类以文字和纯色背景为主的内容,减到 64 到 128 色几乎无损。
- 带简单透明边缘的素材:例如纯色圆形图标。
不适合减色的:
- 照片:肤色与自然纹理包含大量细微色差,减到 256 色会出现色块与脏斑。
- 平滑渐变背景:最容易暴露色带,尤其是大面积深色渐变。
- 柔光质感素材:玻璃、金属、水滴的高光过渡,减色后立刻显得廉价。
- 已经压过的低质量图:再减色只会放大已有缺陷。
颜色数怎么选:32、64、128、256 的经验区间
颜色数滑杆每一档都是画质与体积的交换。下表区间来自常见素材的经验值,可作为起点,最终仍以肉眼对比为准。
| 颜色数 | 典型体积变化 | 推荐素材 | 风险 |
|---|---|---|---|
| 2 到 16 色 | 极小,常低于原图一成 | 单色图标、纯黑白线条、简单 logo | 稍有色阶就断层 |
| 32 色 | 很小 | 简单扁平插画、单色系 UI 图标 | 阴影与浅渐变开始出现色带 |
| 64 色 | 通常只有原图两到四成 | 文档截图、代码截图、聊天界面 | 彩色图表里的浅色区分可能丢失 |
| 128 色 | 中等 | 彩色截图、信息图、颜色较多的插画 | 照片级内容出现明显块状 |
| 256 色 | 收益有限,但仍优于真彩色 | 颜色丰富的插画、复杂 UI 截图 | 对照片仍然不够 |
建议从 256 色开始逐档下探,每降一档就看一次对比预览,直到出现肉眼可见的画质下降,再退回上一档。文字截图优先保证可读性,边缘出现彩色噪点就说明降过头了。在 PNG 图片压缩 页面里可以直接用压缩前后对比预览并排检查,配合颜色数滑杆反复微调。
透明通道在减色时的注意点
透明是 PNG 减色最容易翻车的地方。真彩色的 alpha 是每像素 8 位,能做到 256 级平滑过渡,圆角、投影、羽化边缘都自然。索引色只有一张调色板,透明通常有两种实现:整张图只有一个完全透明的色项,其余全不透明,边缘会变锯齿;或者允许调色板里多个条目带 alpha,但总数仍受 256 条限制,等于颜色和透明度在抢同一个额度。
于是会出现这种情况:给带柔和阴影的图标减色,阴影的渐变透明度被压成少数几档,边缘出现同心圆带;或者颜色数选得太低,半透明像素没有可用条目,被迫变成全透明或全不透明,出现白边黑边。
处理办法:
- 带半透明的素材保留 128 色以上,不要把颜色数压到极限。
- 边缘硬切的素材可以用单色透明模式,体积更小。
- 边缘出现白边时,检查原图是否为白底加 alpha,必要时先去掉白底再减色。
- 实在无法兼顾观感与体积时,改用 WebP。它同时支持有损压缩与完整 alpha,往往比 PNG8 更小也更好看,可使用 WebP 图片压缩 继续优化。
实操流程与常见误区
一套稳定的流程大致是这样:先判断素材类型,照片类直接走 JPEG 或 WebP,不要在减色上浪费时间;图标、插画、截图类交给 PNG8。导入后先看原始体积与尺寸,如果尺寸远超实际展示需求,先缩尺寸再减色,顺序反了会白白多调一轮参数。然后从 256 色起逐档下探,配合对比预览确认,带透明的素材单独盯边缘。最后确认收益是否值得,如果从 256 色降到 64 色只省了几 KB,画质却已能看出差别,就该停手。
几个误区值得点破。其一,认为无损模式一定最好:无损模式确实不损失像素,但对 PNG 压缩率的提升有限,很多素材的大头是颜色位深,不减色拿不到数量级的变化。其二,认为颜色数越低越好:色带与抖动的代价常常比省下的体积更贵。其三,认为 PNG 能无损压到很小:一张照片级 PNG 若有三四 MB,靠减色很难同时保住观感与体积,换格式才是正解。需要系统了解各类格式的取舍,可以看 图片压缩完整教程。工具全程在浏览器本地用 WebAssembly 处理,图片不上传服务器,无需注册、无水印、无数量限制,支持批量与打包下载。
想直接动手试?打开 在线图片压缩 - 免费压缩 JPEG、PNG、WebP ,把图片拖进去即可,全程在浏览器本地处理。