论坛首页 移动开发技术论坛

PNG8文件格式

浏览 2461 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-01-10   最后修改:2010-02-08
手机j2me游戏中,png是唯一可在程序中直接使用的图片文件,用midp直接Image.create就可得到图片。当然不排除你不怕麻烦使用其他图片,然后转成png再使用。同时,为了保证可移植性,游戏都采用png8,而png24在一些手机上会出问题,同时,png24文件太大了。鉴于png8的重要性本文提提其格式。网上找的一些资料,有些瑕疵,这边再写一下。
它是按照我的经验分法进行分块的,不是标准的哦:
1文件头块
2IHDR块
3PLETE块
4tRNS块,(如果无此块,表明此图全部都不透明)
5IDAT块
6文件尾块
7其他非必要的块,如iCCP块,gAMA块

1是固定的。
都是0x89504e470d0a1a0a
0x89据说是为了避免被认成是ASCII码,被其他程序误读的。
然后加个回车int,4字节(实际就是IHDR长度啦,呵呵)。共12字节。
然后就到2了
4个IHDR字母,各占一字节,接下来是
图片宽,占4字节,
图片高,占4字节,
色深,占1字节,
颜色类型,占1字节,
压缩方法,占1字节,
滤波方法,占1字节,
扫描方法,占1字节,
再后面加个0x 03 00 00 00,固定的4字节,不知道做什么的,
最后接一个4字节的CRC循环冗余码。
就到了3。很多绘图工具会加上gAMA块,后接iCCP块,如Photoshop ICC profile啊什么的。这些全是可以不用的,png压缩完全可以马上把这些做掉。
3是以一个int开始的,4字节,它告诉你PLETE块长度,
然后是PLETE四个字母,各占一字节
然后块数据开始,读啊读,从1数到刚才读到的长度
最后又一个4字节的CRC。
进入4。
4也是以一个int开始的,4字节,它告诉你tRNS块长度
然后是tRNS四个字母,各占一字节
然后块数据开始,读啊读,从1数到刚才读到的长度
最后又一个4字节的CRC。
然后就到了5,IDAT块了。
同PLETE和tRNS一样的。这里不说了。
但特别要注意,此块可能有几块,结构一样。如果有几块,除最后一块,长都是8192。
(读取时,把这所有块拼成一块,放到java.util.zip.InflaterInputStream里,就可解压开来,再根据IHDR的几个数据,可以还原到最初状态,哪天有空再提提这块)
最后到6。
结束块。
也是结束块大小int占4字节
四个字母IEND,分别占一字节,接着crc。完了。

有了这些,你爱压缩,加密都可以了。
感谢
http://book.csdn.net/bookfiles/943/10094329496.shtml
的作者

http://www.99inf.net/SoftwareDev/Java/53978.htm
的作者CoCoMo
网友可以详细参考以上两文。

注意,上面CoCoMo上提到的色深是4byte,经图片验证实际上只有1byte
对于tRNS,如果够胆量只留一个byte00,你就必须修改色盘的index,因为经这样修改,第一个就是透明色了,后面色往后移(没修改前,一般最后一个index是透明的)。同样,你要对IDAT进行修改,把之解压,变换,再压缩。呵呵,很复杂了。
要是用Image.createARGB()来搞,就没那么复杂

论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics