使用zlib解压PNG图片

4

我需要使用zlib库来解压PNG文件,我需要在gcc编译器下使用C语言读取PNG文件。


嗨,你能在这里分享C代码帮助我们吗?谢谢! - undefined
4个回答

4

为什么不使用libpng呢?PNG文件格式相当简单,但有许多不同的可能性和编码方法,确保覆盖所有情况可能会相当繁琐。类似于libpng可以自动处理所有转换和其他事项。


你好,因为我被告知要使用标准的C库,所以我不能使用libpng库吗? - name_masked
由谁说的?这是作业吗?如果是,你应该添加一个“作业”标签。 - Dean Harding
@darkie15: zlib库与libpng一样,不再是“标准C库”。如果这确实是任务要求,我想你应该使用fread和相关函数? - Thomas
嗨,托马斯,我没听懂你的意思。你说的“朋友”是什么意思? - name_masked
1
我说这个格式相当简单,但对于一个初学者(你似乎是),需要一些时间... 我建议从规范文档(http://www.libpng.org/pub/png/spec/1.1/PNG-Contents.html)开始,它非常好,并且详细介绍了很多内容。如果您对规范有更多(具体的)问题,请随时在这里提问。 - Dean Harding
谢谢codeka。我有一个问题:当我在文本编辑器中打开PNG文件时,数据根本不可读。这是因为PNG文件现在被压缩了吗?你能帮我理解一下吗? - name_masked

2
如果这是一项作业,并且你只能使用标准C库,你需要查看官方PNG文件格式规范:http://www.w3.org/TR/PNG/。但是,你确定你真的需要解码PNG文件吗?如果你只需要以某种方式显示它,那么你正在走错路。
编写通用PNG文件的解码器将会相当复杂和耗时,但对于简单的PNG文件来说并不太糟糕。实际上,因为PNG格式允许对其进行压缩,所以仅使用标准C库进行解码将要求你实现gzip解压缩(这是一个适合中级本科课程的合理作业,但我的猜测是在分配此任务之前你已经讨论了很多压缩算法)。
然而,如果你限制自己只处理非压缩、非交错的PNG文件,那么这并不是非常困难。我曾经用Python写过一个只处理简单情况的解码器,在几个小时内就完成了,所以我相信在C中也是可行的。

嗨,smehmood,谢谢你提供的信息。但我需要使用标准的C函数读取PNG文件,解压文件,然后以可读的格式打印该文件的信息。要打印的信息包括:PNG文件的结构,PNG文件的签名,每个块的类型和长度。 - name_masked
1
你所描述的非常可行。你只需要阅读我提供的PNG文件格式规范,它会告诉你文件的布局以及所有信息存储的位置。 - smehmood

2
我曾经编写过一个基本的Java库,用于读/写PNG文件:http://code.google.com/p/pngj/ 更新:现在它支持所有PNG变体,除了不支持调色板图像外,它相当完整、简单,并且代码没有外部依赖(即仅使用标准JSE API,其中包括zip解压缩)。代码可供使用。我想你可以轻松地将其移植到C语言。

0
你应该了解二进制文件格式的工作原理,并使用十六进制编辑器而非文本编辑器查看文件。通常情况下,如前所述,您应该使用libpng来处理png文件,但如果您想要自行解码,则需要大量阅读。 我建议阅读这个 http://www.libpng.org/pub/png/book/chapter13.html

嗨,我被告知只能使用标准的C库,而zlib是唯一额外提供的库。你能给我一些指引吗? - name_masked
我给出的链接是关于libpng如何解压png文件的详细描述。我的猜测是,在取出头部等内容后,应该对原始数据使用zlib。 - Hobblin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接