2010-03-29 312 views

回答

2

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

它不支持palleted图像,但除了那 [更新:它支持现在所有的PNG变种]这是相当完整的,简单的代码,没有外部的依赖关系(即只使用标准JSE API ,其中包括zip解压缩)。代码可用。我想你可以用很少的努力将它移植到C上。

4

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

+0

嗨,因为我被告知使用标准C库,我不能使用libpng库吗? – 2010-03-29 04:17:26

+0

告诉谁?这是功课吗?如果是这样,你应该为'家庭作业'添加一个标签。 – 2010-03-29 04:24:42

+0

好的。你现在可以引导我吗? – 2010-03-29 07:29:14

0

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

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

+0

嗨,我被告知只使用标准的C库和zlib是唯一一个正在额外提供。你能给我一些指点吗? – 2010-03-29 04:16:47

+0

我给出的链接是关于libpng如何解压缩png的详细说明。我的猜测是zlib应该在取出标题等之后用于原始数据。 – Hobblin 2010-03-29 14:26:32

2

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

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

但是,如果将自己限制为非压缩的非隔行PNG文件,这并不是非常困难。我在Python中编写了一个解码器,仅在几个小时内处理了简单的情况,所以我确信它可以在C中实现。

+0

嗨smehmood,谢谢你的信息。但我需要使用标准C函数读取PNG文件,解压缩文件,然后以可读格式打印文件的信息。要打印的信息包括:PNG文件的结构,PNG文件的签名,每个块的类型和长度。 – 2010-03-29 17:49:15

+1

你所描述的是非常可行的。你只需要阅读我提供的PNG文件格式规范,它会告诉你文件是如何布局的,以及所有信息的存储位置。 – smehmood 2010-03-29 19:08:00