PNG格式中滤波与DEFLATE压缩的配合

PNG先做逐行预测,再把结果交给DEFLATE

PNG 文件变大或变小,关键不只在“压缩级别”,还在滤波器怎样改写扫描行。滤波器不删除像素,而是用邻近字节预测当前字节,再把实际值与预测值的差交给 DEFLATE;不同残差排列会直接影响 LZ77 匹配和 Huffman 编码。

PNG 规范是 ISO/IEC 15948:2003,图像数据位于 IDAT 块承载的压缩流中。每条扫描行开头都有 1 个滤波类型字节,取值为 0~4,解码器据此还原像素。

  • 0 None:直接输出原始字节,适合相邻数据缺少规律的情况。
  • 1 Sub:用当前行左侧、距离为每像素字节数 bpp 的字节预测当前值。
  • 2 Up:用上一行同一位置的字节预测当前值。
  • 3 Average:取左侧字节与上方字节的整数平均值。
  • 4 Paeth:根据左、上、左上三个字节计算线性预测,再选择距离预测值最近的邻居。

滤波结果按字节模 256 计算。8 位样本的范围是 0~255;例如实际值为 10、预测值为 250,残差不是负数,而是 16。16 位颜色也按字节序列处理,不能把两个字节简单当成一个 0~65535 的整数预测。

残差怎样影响LZ77匹配和文件大小

DEFLATE 把 LZ77 与 Huffman 编码组合起来:LZ77 用“长度—距离”描述重复片段,Huffman 编码再根据符号频率分配变长编码。滤波器本身不会减少扫描行字节数,却可能让残差更重复,或者让某些字节出现得更集中。

  • 横向渐变中,当前字节与左侧字节变化较稳定,Sub 常能产生相似残差。
  • 上下相邻行变化较小的区域,Up 往往能产生连续的 0 或重复字节。
  • 斜线、文字边缘和渐变交界处同时受左右与上下像素影响,Paeth 有机会减少残差,但不保证每行最优。
  • 照片中的局部纹理可能没有稳定预测关系,None 有时反而保留了更适合 LZ77 的原始重复。

“残差绝对值之和更小”只能当作快速评分,不能当作最终文件大小。它没有完整反映重复片段长度、出现位置和 DEFLATE 的压缩策略;一种滤波可能让单字节更小,却破坏跨行重复,导致 IDAT 变大。

编码器怎样选滤波器:从候选行到IDAT

一个常见的编码流程可以按下面执行:

  1. 读取一条原始扫描行,计算每个像素占用的字节数。例如 RGBA、8 位每通道时,bpp=4。
  2. 对允许的 5 种滤波器分别计算候选残差。
  3. 用绝对值之和等启发式评分筛选候选;具体公式由编码器决定。
  4. 把选中的类型编号写入行首,再写入该行残差。
  5. 连接全部扫描行,交给 DEFLATE,结果写入一个或多个 IDAT 块。

多个 IDAT 块共同组成同一条压缩数据流,不能把每个 IDAT 当成独立图片。zlib 的压缩级别通常为 0~9,级别 6 常见于默认配置,但默认值、策略和匹配窗口取决于库与调用方式;libpng、ImageMagick 以及其他工具可能采用不同的逐行选择规则。

压缩级别 0 通常表示不进行 DEFLATE 压缩,级别 6 与 9 的大小差异则取决于图像和实现,不能预先保证级别 9 更小。比较时必须固定编码器版本、颜色类型、元数据和压缩参数,否则测到的可能是其他设置的差异。

用可复现实验判断哪种组合更合适

不需要凭肉眼猜 Paeth 是否最好。准备同一组输入,固定输出条件,再分别改变滤波器和 DEFLATE 参数,结果才有可比性。

  1. 制作 5 类测试图:纯色块、水平渐变、垂直渐变、带文字的界面截图和照片。
  2. 统一宽度、高度、颜色类型、位深、透明度及元数据。8 位 RGBA 图像可作为基准,但不要把它与 8 位 RGB 的结果直接比较。
  3. 使用同一工具和版本,至少测试 zlib 级别 0、6、9,并记录文件大小与处理时间。
  4. 工具支持时,分别固定 None、Sub、Up、Average、Paeth,再测试“自动逐行选择”。
  5. 用 PNG 检查工具或脚本记录 IDAT 总字节数;同时记录整文件大小,因为文本块、时间戳等元数据不属于图像压缩流。

判断标准可以这样用:若固定滤波器后 IDAT 更小,说明该图像在当前编码器和压缩参数下更适合这种预测;若绝对值评分更低但 IDAT 更大,说明启发式没有准确预测 LZ77 匹配。若级别 9 只增加处理时间、IDAT 几乎不变,就应优先使用级别 6;但这个结论必须来自自己的测试,不能当成所有图片的规律。

四个结论足以避免常见误判

  • PNG 有 5 种基本滤波类型,编号为 0、1、2、3、4;类型可按扫描行变化。
  • 滤波残差按模 256 计算,改变的是送入压缩器的字节,不是可见像素。
  • DEFLATE 同时依赖 LZ77 重复匹配与 Huffman 频率编码,因此残差绝对值小不等于文件一定更小。
  • PNG 压缩效果取决于图像内容、颜色格式、滤波策略、zlib 参数和编码器版本;“Paeth 一定最好”没有规范依据。

如果工具只显示“压缩质量”,却没有滤波器选项,不能据此判断它没有滤波优化。自动逐行选择可能已经启用;要研究具体差异,应改用能够固定 5 种滤波器、zlib 级别和版本的工具,并至少比较 IDAT 大小与处理时间。

更多推荐

先确认是椒盐噪声,再选择中值滤波 图片里如果是零散的纯黑、纯白孤点,中值滤波通常比均值滤波更适合。实操时从 3×3 窗口开始,和 5×5 结果在同一处放大对比;如果噪点成片、呈连续亮度波动,或软件只提供“模糊”滑块,就不能默认它使用了中值

了解更多 >

像素坐标映射决定缩放结果 图片缩放的核心,不是简单复制或删除像素,而是把目标图像中的每个像素映射回原图坐标,再计算它应当呈现的颜色。放大时,目标像素多于源像素;缩小时,目标像素少于源像素。最近邻和双三次的差别,主要就在于“从原图取多少像素

了解更多 >

二维码的容错等级决定了多少编码空间要让给纠错信息,也会影响最终版本、模块密度和可承受的局部损坏。L、M、Q、H 并不是“能遮住 7%、15%、25%、30% 图像”的面积开关;选择等级时,应把数据长度、打印尺寸和真实扫码测试放在一起判断。

了解更多 >

SVG路径如何转换为像素覆盖率 SVG转PNG时,真正决定边缘效果的不是文件扩展名,而是路径如何被栅格化。SVG路径通常由直线、二次贝塞尔曲线和三次贝塞尔曲线组成;栅格化器不会直接“显示数学曲线”,而是计算曲线与像素网格之间的覆盖关系。

了解更多 >

说明主色提取要解决的实际问题 图片主色提取的目标,是从一张图的像素中找出 3~8 个代表颜色,生成可用于配色、设计参考或图片取色工具的主色板。输出不应只有几个色块,还应包含每种颜色的 HEX、RGB、像素占比,以及明确的排序依据。 直接按

了解更多 >