PNG文件中的Adler-32校验和

时间:2015-11-25 10:54:45

标签: png zlib checksum

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

Adler-32校验和是否根据...

的未压缩数据计算

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

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

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

http://www.w3.org/TR/PNG/http://tools.ietf.org/html/rfc1950和rfc1951(与先前地址相同的地址)的文件中,我认为这是案例' c'上面,允许一个deflate实现切断和更改每个块的数据压缩方式,并忽略压缩块在连续IDAT块之间的分割方式。

这是对的吗?

2 个答案:

答案 0 :(得分:3)

PNG文件中只能有一个压缩图像数据流,这是一个单独的zlib流,最后一个Adler-32检查是所有未压缩的Adler-32 数据(由过滤器和隔行扫描预处理)。该zlib流可能会也可能不会被分解为多个IDAT块。每个IDAT块都有自己的CRC-32,它是块类型代码“IDAT”的CRC-32和压缩的数据。

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

之后,您将其压缩为单个zlib流,您可以将该流分解为一系列IDAT块,或者作为单个IDAT块。

答案 1 :(得分:2)

PNG IDAT块独立于压缩块。 Adler-32校验和只是zlib压缩的一部分,与PNG的整体元结构无关。

来自the PNG Specification

  

可以有多个IDAT块;如果是这样,它们必须连续出现而没有其他干预块。然后,压缩的数据流是所有IDAT块的内容的串联。编码器可以将压缩的数据流分成IDAT块但是它希望如此。 (允许多个IDAT块,以便编码器可以在固定数量的内存中工作;通常块大小将对应于编码器的缓冲区大小。)重要的是要强调IDAT块边界没有语义重要性,可以在压缩数据流中的任何一点发生。

(强调我的)