PNG 文件中的 Adler-32 校验和

Sky*_*ate 2 png checksum zlib

我目前正在编写一个 C 程序,该程序从另一个生成的数据文件构建 PNG 图像。该图像是调色板类型。

Adler-32 校验和是根据未压缩数据计算得出的吗?

a) IDAT 数据块中的每个压缩块?

b) IDAT 数据块中的所有压缩块?

c) 跨越所有 IDAT 数据块的所有压缩块?

从http://www.w3.org/TR/PNG/https://www.rfc-editor.org/rfc/rfc1950和 rfc1951 (与之前的地址相同)的文档中,我认为这是上面的情况“c”,允许 deflate 实现切割和更改每个块的数据压缩方式,并忽略压缩块在连续 IDAT 块之间的分割方式。

它是否正确?

Mar*_*ler 6

PNG 文件中只能有一个压缩图像数据流,即单个 zlib 流,末尾有一个 Adler-32 检查,即所有未压缩数据的 Adler-32(由过滤器和交错)。该 zlib 流可能会也可能不会被分解为多个 IDAT 块。每个IDAT块都有自己的CRC-32,它是块类型代码“IDAT”及其内压缩数据的CRC-32。

我不确定你所说的“允许一个人的 deflate 实现来切割和改变每个块的数据压缩方式”是什么意思。有效 PNG 文件的 deflate 实现必须将所有已过滤的图像数据压缩为单个 zlib 流。

将其压缩为单个 zlib 流后,您可以根据需要将该流分解为一系列 IDAT 块,或单个 IDAT 块。