如何使用zlib库来解压缩PNG文件?我需要使用gcc编译器下的C来读取PNG文件。使用zlib解压缩PNG
回答
我已经编写了一个用于读/写PNG的基本Java库文件:http://code.google.com/p/pngj/
它不支持palleted图像,但除了那 [更新:它支持现在所有的PNG变种]这是相当完整的,简单的代码,没有外部的依赖关系(即只使用标准JSE API ,其中包括zip解压缩)。代码可用。我想你可以用很少的努力将它移植到C上。
为什么不使用libpng? PNG文件格式非常简单,但有许多不同的可能的变体和编码方法,确保覆盖所有的情况可能非常繁琐。像libpng这样的东西自动处理所有的转换和东西。
您应该仔细阅读二进制文件格式的工作原理,并使用十六进制编辑器而不是文本编辑器来查看这些文件。通常你应该使用libpng来处理前面提到的png文件,但是如果你想自己解码,你需要做很多的阅读工作。
嗨,我被告知只使用标准的C库和zlib是唯一一个正在额外提供。你能给我一些指点吗? – 2010-03-29 04:16:47
我给出的链接是关于libpng如何解压缩png的详细说明。我的猜测是zlib应该在取出标题等之后用于原始数据。 – Hobblin 2010-03-29 14:26:32
如果这是一个家庭作业,你真的只限于标准C库,你可以看官方的PNG文件格式规范:http://www.w3.org/TR/PNG/。但是,你确定你确实需要解码PNG文件吗?如果你需要做的就是以某种方式展示它,那么你就走错了路。
为任何一般的PNG文件编写解码器将会非常复杂和耗时,但对于简单的PNG文件来说不会太糟糕。事实上,由于PNG格式允许压缩它的一部分,因此只需要使用标准C库就可以实现gzip解压缩(这是中级本科课程的合理作业),但我的猜测是你在分配给你之前会花费很多讨论压缩算法)
但是,如果将自己限制为非压缩的非隔行PNG文件,这并不是非常困难。我在Python中编写了一个解码器,仅在几个小时内处理了简单的情况,所以我确信它可以在C中实现。
嗨smehmood,谢谢你的信息。但我需要使用标准C函数读取PNG文件,解压缩文件,然后以可读格式打印文件的信息。要打印的信息包括:PNG文件的结构,PNG文件的签名,每个块的类型和长度。 – 2010-03-29 17:49:15
你所描述的是非常可行的。你只需要阅读我提供的PNG文件格式规范,它会告诉你文件是如何布局的,以及所有信息的存储位置。 – smehmood 2010-03-29 19:08:00
- 1. 解压缩Zlib
- 2. ZLIB解压缩
- 3. zlib/libz.dylib解压缩
- 4. Zlib解压缩C++
- 5. zlib压缩和解压
- 6. 的zlib压缩/解压缩Linux编程
- 7. 使用zlib库进行gzip解压缩
- 8. 使用zlib时解压缩错误
- 9. 使用zlib进行内存解压缩
- 10. ZLib位深度为1的PNG压缩
- 11. 解压缩zlib编码nsdata
- 12. 使用zlib和cPickle将字典压缩/解压缩到文件
- 13. 用pako压缩(javascript中的zlib),用zlib(python)解压缩不起作用
- 14. 使用Python zlib的解压缩与JavaScript的zlib
- 15. 放气:解压缩没有zlib的PNG(或任何其他库)
- 16. ZLIB压缩
- 17. PNG:紧缩和zlib
- 18. png文件的压缩和解压缩
- 19. 调用C zlib的解压缩从C#
- 20. 在Nodejs中使用zlib压缩和解压数据
- 21. 在c#中使用zlib压缩文件时解压文件
- 22. zlib压缩错误
- 23. ASIHTTPRequest的zlib压缩
- 24. 'zlib'的解压缩()返回Z_DATA_ERROR
- 25. 的Zlib解压缩回报Z_DATA_ERROR
- 26. zlib不同的解压缩大小
- 27. 如何解压缩的zlib的NSData
- 28. Python:解压缩zlib字符串
- 29. Boost Zlib在解压缩时失败
- 30. zlib解压缩头检查错误
嗨,因为我被告知使用标准C库,我不能使用libpng库吗? – 2010-03-29 04:17:26
告诉谁?这是功课吗?如果是这样,你应该为'家庭作业'添加一个标签。 – 2010-03-29 04:24:42
好的。你现在可以引导我吗? – 2010-03-29 07:29:14