1

我正在尝试在没有任何外部库的情况下编写自己的 png 阅读器。我需要使用 Zlib 来解压 png 的 IDAT 块。我已经设法在 python 中使用它来完成它zlib.decompress(),并且我正在尝试在 C 中复制它。我正在阅读 zlib 的文档并发现uncompress()它,但是它需要一个我不知道的目标长度。

我可以将目标设置为比 png 可能的更大,但这似乎是一种逃避,如果我有一张非常大的图片,这会破坏我的程序。但是,我发现了一个inflate()可以多次使用的功能。如果我能做到这一点,我可以realloc()在每次通话需要时记忆。然而,我不太了解它的文档,也没有找到很多这类事情的例子。谁能提供一些代码或帮助我指出正确的方向?

4

1 回答 1

1

确实知道目标长度。确切地。PNG 标头信息告诉您有多少行、多少列以及每个像素有多少字节。将其全部相乘,每行添加一个字节进行过滤,您就有了答案。

分配该数量的内存,然后解压缩到该内存中。

请注意,可以有多个 IDAT 块,但它们组合起来包含一个 zlib 流。

于 2020-10-18T06:43:59.683 回答