PNG
1. 文件头标识 (File Signature)
用于声明文件类型,固定为 8 字节。
-
十六进制:
89 50 4E 47 0D 0A 1A 0A -
ASCII 映射:
.PNG....
2. 数据块通用结构 (Chunk Structure)
PNG 文件由文件头及后续一系列数据块(Chunk)紧密拼接而成。每个数据块严格遵循 4 字节 + 4 字节 + 变长 + 4 字节 的底层布局:
-
Length (长度): 4 字节,指示 Data 字段的字节数(不含 Type 和 CRC)。
-
Type (类型): 4 字节,ASCII 字符表示的数据块标识符。
- 命名规则: 首字母大写代表关键数据块(解析器遇到未知的必须报错停止);首字母小写代表辅助数据块(遇到未知的可安全跳过)。
-
Data (数据): 长度由 Length 决定,Length 为 0 时此区段为空。
-
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. 数据处理核心机制
-
滤波 (Filtering): 压缩前的预处理步骤,利用相邻像素的颜色相关性计算差值,提高后续压缩率。PNG 定义了 5 种基于字节的预测器类型:
None、Sub(左侧差值)、Up(上方差值)、Average(左上平均差值)、Paeth(左、上、左上非线性预测)。 -
压缩 (Compression): 采用无损的 DEFLATE 算法(LZ77 字典压缩 + Huffman 熵编码),确保图像解压后能 100% 还原原始像素矩阵。