【问题标题】:Decompress PNG using zlib使用 zlib 解压缩 PNG
【发布时间】:2023-07-05 07:12:02
【问题描述】:

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

【问题讨论】:

    标签: c gcc png zlib


    【解决方案1】:

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

    【讨论】:

    • 您好,因为有人告诉我使用标准 C 库,所以我不能使用 libpng 库?
    • 谁告诉的?这是作业吗?如果是这样,您应该为“作业”添加一个标签。
    • @darkie15:zlib 库不再是一个“标准 C 库”,而不是 libpng。如果这真的是任务,我想你应该使用fread和朋友?
    • 嗨,Thomas,我没找到你。你说的“朋友”是什么意思??
    • 我说格式相当简单,但对于初学者(你似乎是)来说,这需要一段时间......我将从规范文档(libpng.org/pub/png/spec/1.1/PNG-Contents.html)开始,它是相当不错,并详细介绍了很多。如果您对规范有更多(具体)问题,请随时在此处提出更多问题。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 嗨,smehmood,感谢您提供的信息。但是我需要使用标准的 C 函数读取 PNG 文件,解压缩文件,然后以人类可读的格式打印文件的信息。要打印的信息包括:PNG文件的结构、PNG文件的签名、每个块的类型和长度。
      • 你所描述的非常可行。你只需要阅读我提供的PNG文件格式规范,它就会告诉你文件是如何布局的,以及所有信息的存储位置。
      【解决方案4】:

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

      我推荐阅读这个http://www.libpng.org/pub/png/book/chapter13.html

      【讨论】:

      • 嗨,我被告知只能使用标准 C 库,而 zlib 是唯一另外提供的库。能给我指点一下吗?
      • 我给出的链接是关于libpng如何解压png的详细描述。我的猜测是,在您取出标头等之后,应该在原始数据上使用 zlib。