Skip to content

PNG

1. 文件头标识 (File Signature)

用于声明文件类型,固定为 8 字节。

  • 十六进制: 89 50 4E 47 0D 0A 1A 0A

  • ASCII 映射: .PNG....

2. 数据块通用结构 (Chunk Structure)

PNG 文件由文件头及后续一系列数据块(Chunk)紧密拼接而成。每个数据块严格遵循 4 字节 + 4 字节 + 变长 + 4 字节 的底层布局:

  1. Length (长度): 4 字节,指示 Data 字段的字节数(不含 Type 和 CRC)。

  2. Type (类型): 4 字节,ASCII 字符表示的数据块标识符。

    • 命名规则: 首字母大写代表关键数据块(解析器遇到未知的必须报错停止);首字母小写代表辅助数据块(遇到未知的可安全跳过)。
  3. Data (数据): 长度由 Length 决定,Length 为 0 时此区段为空。

  4. CRC (循环冗余校验): 4 字节,基于 Type 和 Data 区段计算的校验和,用于完整性校验与防篡改检测。

3. 标准关键数据块 (Critical Chunks)

构架图像主体的核心结构,必须严格按照规范排序和解析。

3.1 IHDR (文件头数据块)

位于文件头标识后第一个数据块,定义图像基础属性,Data 长度固定为 13 字节:

  • 宽度 (Width): 4 字节

  • 高度 (Height): 4 字节

  • 位深度 (Bit Depth): 1 字节(取值: 1, 2, 4, 8, 16)

  • 颜色类型 (Color Type): 1 字节

    • 0: 灰度

    • 2: RGB 真彩色

    • 3: 索引颜色

    • 4: 灰度 + Alpha 透明度

    • 6: RGB + Alpha 透明度

  • 压缩方式 (Compression): 1 字节(固定为 0,即 DEFLATE 算法)

  • 滤波方式 (Filter): 1 字节(固定为 0)

  • 扫描方式 (Interlace): 1 字节

    • 0: 非隔行扫描(从左至右,从上至下顺序加载)

    • 1: Adam7 隔行扫描(分 7 次交错加载,实现渐进式模糊到清晰的渲染)

3.2 PLTE (调色板数据块)

颜色查找表,通过索引大幅压缩文件体积。

  • 结构: 连续的 RGB 三元组(3 字节/颜色)。

  • 限制: Length 必须为 3 的倍数。最大支持 256 种颜色(768 字节)。

  • 规则: 颜色类型为 3 时必须存在;类型 2 或 6 时可选存在(作为降级显示参考);类型 0 或 4 时严格禁止存在。

  • 位置: 必须位于 IHDR 之后,且在 IDAT(以及 tRNS、bKGD)之前。

3.3 IDAT (图像数据块)

存储经过滤波和压缩处理的实际像素流。

  • 一个 PNG 文件可包含多个连续排列的 IDAT 数据块。

  • 单个 IDAT 数据块的最大限制为 \(2^{31}-1\) 字节。

3.4 IEND (文件结束数据块)

文件结尾的绝对标识,其后禁止存在任何数据流。

  • 固定内容: Length: 00 00 00 00, Type: IEND, CRC: AE 42 60 82。

4. 辅助数据块 (Ancillary Chunks)

记录附加元信息,位置受依赖关系的严格约束。

  • 影响全局颜色解析(必须位于 PLTE 和 IDAT 之前):

    • gAMA: 伽马校正

    • cHRM: 基色和白点参数

    • sRGB: 标准色彩空间

  • 影响像素/背景渲染(必须位于 IDAT 之前):

    • tRNS: 透明度信息(若含调色板则必须在 PLTE 后)

    • bKGD: 建议背景色

  • 纯附加信息(位置无严格限制):

    • eXIf: EXIF 元信息(相机参数等)

    • tIME: 最后修改时间

    • tEXt: 未压缩文本(作者、版权)

    • zTXt: 压缩文本

5. 数据处理核心机制

  1. 滤波 (Filtering): 压缩前的预处理步骤,利用相邻像素的颜色相关性计算差值,提高后续压缩率。PNG 定义了 5 种基于字节的预测器类型:None、Sub(左侧差值)、Up(上方差值)、Average(左上平均差值)、Paeth(左、上、左上非线性预测)。

  2. 压缩 (Compression): 采用无损的 DEFLATE 算法(LZ77 字典压缩 + Huffman 熵编码),确保图像解压后能 100% 还原原始像素矩阵。