Portable Network Graphics (PNG) 格式将图像数据组织成一系列离散的“块”。每个块都遵循特定的结构:4 字节的长度、4 字节的名称、实际数据,以及用于错误检测的循环冗余校验 (CRC)。这些块的命名约定决定了解码器如何处理它们。例如,大写字母表示显示图像正确所需的“关键”块,而小写字母表示“辅助”块。这种区别意味着,虽然像“IHDR”(图像头)这样的元数据对于定义宽度、高度和位深度至关重要,但其他信息如“gAMA”(伽马)或“pHYs”(物理尺寸)对于基础渲染被视为可选的。

一个说明 PNG 块命名约定的图形,显示了辅助、公共、保留和不安全等类别。
PNG 块的命名约定决定了解码器如何优先处理和处理不同类型的数据。iter.ca

这些块的命名约定决定了解码器如何处理它们。例如,大写字母表示显示图像正确所需的“关键”块,而小写字母表示“辅助”块。

解码过程的核心是包含实际压缩图像数据的“IDAT”块。由于流式编码器可能无法预先知道总数据长度,因此一个 PNG 文件可以包含多个 IDAT 块,解码器会将它们拼接成一个单一流。然后,该流使用标准的 zlib 算法进行解压。然而,仅靠解压并不能产生可查看的图像;得到的数据看起来是倾斜或扭曲的,因为图像的每一行都包含一个“过滤器”字节。这些过滤器——如“Average”(平均)、“Up”(上)或“Paeth”——旨在通过描述像素与其邻域之间的关系来使数据更易于被 zlib 压缩。为了重建最终图像,解码器必须对数据进行“去过滤”处理,在逐行基础上撤销这些数学运算。

除了标准解码外,PNG 格式还支持“交错”,允许图像以渐进式步骤加载。这是通过将图像分成七个非重叠区域(称为 Adam7)来实现的。这些步骤按顺序存储在文件中,允许查看器首先显示图像的低分辨率版本,随着更多步骤的加载,图像逐渐增加细节。这种技术对于人类视觉感知特别有用,因为在初始加载阶段,水平细节通常被优先考虑。虽然该格式非常稳健,但即使是过滤器计算中的微小错误——例如在“Average”过滤器中错误处理整数溢出——也可能导致严重的视觉伪影,因为像素的数学重建失败了。

一个图表显示 8x8 网格中的七个非重叠 Adam7 步骤,说明了渐进式图像加载。
Adam7 交错方法将图像分成七个步骤,以允许渐进式加载和显示。iter.ca

这是通过将图像分成七个非重叠区域(称为 Adam7)来实现的。这些步骤按顺序存储在文件中,允许查看器首先显示图像的低分辨率版本,随着更多步骤的加载,图像逐渐增加细节。

一个彩色字母 S,从四分之一处开始出现故障和扭曲。
当由于过滤器计算错误导致像素的数学重建失败时,可能会出现视觉伪影。iter.ca

虽然该格式非常稳健,但即使是过滤器计算中的微小错误——例如在“Average”过滤器中错误处理整数溢出——也可能导致严重的视觉伪影,因为像素的数学重建失败了。