【问题标题】:Adler-32 checksum(s) in a PNG filePNG 文件中的 Adler-32 校验和
【发布时间】:2016-02-28 03:11:12
【问题描述】:

我目前正在编写一个 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 块之间的分割方式。

这对吗?

【问题讨论】:

    标签: png zlib checksum


    【解决方案1】:

    PNG 文件中只能有一个压缩图像数据流,即单个 zlib 流,末尾带有单个 Adler-32 检查,即所有 未压缩的 Adler-32 em> 数据(由过滤器和隔行扫描预处理)。该 zlib 流可能会也可能不会分成多个 IDAT 块。每个 IDAT 块都有自己的 CRC-32,即块类型码“IDAT”的 CRC-32 和其中的压缩数据。

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

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

    【讨论】:

    • 关于“允许一个 deflate 实现来切割和更改每个块的数据压缩方式”是对每个 BTYPE 可能具有不同值的块的引用。
    • 那么是的,你可以随意组合 deflate 流,只要它是一个有效的、单个的 deflate 流,最后一个块。这与 IDAT 分块无关。
    • “将其压缩为单个 zlib 流后,您可以分解该流” 澄清一下:“之后”是相当概念性的。我的意思是,实现不需要在内存中拥有完整的压缩流来开始将其分解为 IDAT 片段(并最终传输它们),它可以逐步完成。
    【解决方案2】:

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

    来自the PNG Specification

    可以有多个 IDAT 块;如果是这样,它们必须连续出现,没有其他中间块。压缩后的数据流是所有 IDAT 块内容的串联。编码器可以按照自己的意愿将压缩的数据流分成 IDAT 块。 (允许多个 IDAT 块,以便编码器可以在固定数量的内存中工作;通常块大小将对应于编码器的缓冲区大小。)需要强调的是,IDAT 块边界没有语义意义并且可能会出现。压缩数据流中的任意点。

    (强调我的)

    【讨论】:

    • 是的,Alder-32 只关心未压缩的数据流,独立于 PNG 块。一个 PNG 文件可以有 >= 1 个存储压缩图像数据的 IDAT 块。 Alder-32 校验和仅适用于未压缩的图像数据。因此,关于我的问题,整个未压缩图像数据(怀疑为选项 c)是否只有一个 Alder-32 校验和?
    • @SkyPirate:对您的评论稍作更正:它是“Adler”,而不是“Alder”。
    猜你喜欢
    • 2017-06-02
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多