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

Adler-32校验和是针对以下数据的未压缩数据计算的吗?

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

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

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

http://www.w3.org/TR/PNG/http://tools.ietf.org/html/rfc1950和rfc1951的文档(与previuos位于相同的地址),我认为上面的情况是'c',允许deflate实现斩波并更改每个块的数据压缩方式,而忽略了如何压缩块在连续的IDAT块之间拆分。

这样对吗?

最佳答案

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

我不确定“允许一个人的deflate实现斩波并更改每个块的数据压缩方式”是什么意思。有效PNG文件的deflate实现必须将所有过滤后的图像数据压缩为单个zlib流。

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

关于png - PNG文件中的Adler-32校验和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33914640/

10-10 21:03