我正在尝试在没有任何外部库的情况下编写自己的png阅读器。我需要使用Zlib来解压缩png的IDAT块。我已经使用zlib.decompress()
在python中完成了这项工作,并试图在C中复制它。我阅读了zlib的文档,发现了uncompress()
,但它需要一个我不知道的目标长度。
我可以为png设置一个比可能大得多的目的地,但这似乎是一种逃避,如果我有一个真正的大画面,就会破坏我的程序。然而,我发现了一个可以多次使用的函数inflate()
。如果我能做到这一点,如果每次调用都需要的话,我可以使用realloc()
内存。然而,我不太了解它的文档,也没有找到太多关于这类事情的例子。有人能提供一些代码或帮助我指明正确的方向吗?
您确实知道目标长度。确切地PNG头信息告诉每像素行数、列数和字节数。把它相乘,每行加一个字节进行过滤,你就有了答案。
分配那么多内存,然后解压缩到其中。
请注意,可以有多个IDAT块,但它们组合后包含一个zlib流。