我目前正在编写一个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块之间的分割方式。
这是对的吗?
答案 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的整体元结构无关。
可以有多个IDAT块;如果是这样,它们必须连续出现而没有其他干预块。然后,压缩的数据流是所有IDAT块的内容的串联。编码器可以将压缩的数据流分成IDAT块但是它希望如此。 (允许多个IDAT块,以便编码器可以在固定数量的内存中工作;通常块大小将对应于编码器的缓冲区大小。)重要的是要强调IDAT块边界没有语义重要性,可以在压缩数据流中的任何一点发生。
(强调我的)