浏览 2462 次
锁定老帖子 主题:PNG8文件格式
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-10
最后修改:2010-02-08
它是按照我的经验分法进行分块的,不是标准的哦: 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()来搞,就没那么复杂 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |