我目前正在编写一个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/