PNG 文件解码流程
20 May 2024
Read time: 1 minute(s)
PNG 图像的解码流程分为以下几个部分,如图所示:
- 硬件实现:即上图中的虚线框部分。
- 软件实现:即图中虚线框外的 PNG parser 和 Read zlib Header。图中蓝色部分是 PNG 解码和 zlib 解码不一样的地方:
- 对于 zlib 解码:解码后,每一行都需要进行 Defilter 处理,恢复原始的像素。关于 zlib 解码的详细说明,可查看 Zlib 解码和 Gzip 解码流程。
- 对于 PNG 解码:PNG 图片的 deflate 数据可能存放在多个 IDAT 数据块中,硬件不支持解析
IDAT,所以需与软件配合才能完成解码。
- 软件解析所有 IDAT 数据,并把 IDAT 中的 deflate 数据拷贝到一块物理连续 buffer 中。
- 硬件读取该 buffer 中的 deflate 数据并完成解码。
Zlib 解码和 Gzip 解码流程
Deflate 压缩格式有以下两种封装方式:
- Zlib 封装,结构如下:
- CMF 是压缩方式的描述, FLG 中的 FDICT 标记了是否使用预先设置的字典,目前不支持 FDICT 为 1 的情况。ADLER32 为类似于 CRC32 的校验码。zlib 封装详细说明请参考 RFC1950。
- Zlib 封装部分由软件解析,Deflate 码流部分,由硬件 Inflate 模块解析,硬件解码完成后生成对应的 ADLER32 校验码,然后由软件比较硬件生成的校验码和 zlib 格式封装中 ADLER32 是否一致。如果一致则说明 zlib 解码正确。
- Gzip 封装,结构如下:
- 对 Deflate 格式加入了头信息和尾部信息。gzip 对原始码流用 CRC32 校验,和 zlib 中的校验方式不同。并且尾部加入了 4 bytes 的原始码流的 size 信息。硬件解码时候,可以根据 size 的大小,来申请输出 Buffer。Gzip 封装的详细说明请参考 RFC1952。
- Gzip 封装部分由软件解析,Deflate 码流部分,由硬件 Inflate 模块解析,硬件解码完成后生成对应的 CRC32 校验码,然后由软件比较硬件生成的校验码和 gzip 格式封装中 CRC32 是否一致。如果一致则说明 gzip 解码正确。