3

如何使用 zlib 库解压缩 PNG 文件?我需要在 gcc 编译器下使用 C 读取 PNG 文件。

4

4 回答 4

4

为什么不使用libpng?PNG 文件格式相当简单,但有许多不同的可能变体和编码方法,确保涵盖所有情况可能相当繁琐。像 libpng 这样的东西会自动为你处理所有的转换和东西。

于 2010-03-29T02:45:23.013 回答
2

如果这是一个家庭作业并且您真的只限于标准 C 库,那么您可以查看官方的 PNG 文件格式规范:http ://www.w3.org/TR/PNG/ 。但是,你确定你真的需要解码 PNG 文件吗?如果您需要做的只是以某种方式显示它,那么您就走错了路。

为任何一般的 PNG 文件编写解码器将相当复杂和耗时,但对于简单的文件来说并不算太糟糕。事实上,由于 PNG 格式允许压缩其中的一部分,因此仅使用标准 C 库来执行此操作将需要您实现 gzip 解压缩(对于中级本科课程来说,这是一个合理的家庭作业,但我的猜测是您在分配给你之前,我会花很多时间讨论压缩算法)

但是,如果您将自己限制在非压缩、非隔行扫描的 PNG 文件中,这并不是很困难。我曾经在 Python 中编写过一个解码器,它只在几个小时内处理简单的情况,所以我确信它在 C 中是可行的。

于 2010-03-29T07:39:54.277 回答
2

我曾经编写过一个用于读取/写入 PNG 文件的基本 Java 库:http ://code.google.com/p/pngj/

它不支持托盘图像,但除此之外[更新:它现在支持所有 PNG 变体] 它相当完整、简单并且代码没有外部依赖项(即它只使用标准 JSE API,其中包括 zip 解压缩)。并且代码可用。我想你可以毫不费力地将它移植到C。

于 2010-03-30T17:31:00.963 回答
0

您可能应该阅读二进制文件格式的工作原理并使用十六进制编辑器而不是文本编辑器来查看文件。通常你应该使用 libpng 来处理前面提到的 png 文件,但是如果你想自己解码它,你有很多阅读要做。

我建议阅读此http://www.libpng.org/pub/png/book/chapter13.html

于 2010-03-29T02:53:16.377 回答