手机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()来搞,就没那么复杂
分享到:
相关推荐
1. **PNG文件标志**:每个PNG文件以一个固定的8字节标志开始:“89 50 4E 47 0D 0A 1A 0A”,其中“50 4E 47”对应ASCII字符“PNG”。 2. **数据块(chunks)**:数据块是PNG文件的主要组成部分,分为两种类型: -...
下面我们将深入探讨PNG文件格式的相关知识点。 1. **PNG文件结构**: PNG文件由一个8字节的PNG签名开始,用来确认文件类型。接着是PNG头信息块(IHDR),包含图像的宽度、高度、颜色类型、位深度、压缩方法、过滤...
解析png文件格式,详细处理png各个chunk,且可设定idat 压缩等级。vc-analytic png file format, every detail png chunk, idat which can be set compression level.
例如,通过`TPNGObject.LoadFromFile`方法可以加载PNG文件,然后将`TPNGObject`赋值给`TImage.Picture.Graphic`,就可以在TImage组件上显示PNG图片。反之,`TPNGObject.SaveToFile`可以将内存中的PNG对象保存为文件...
PNG文件格式的核心特点: 1. **无损压缩**:PNG使用一种基于 zlib 压缩算法的无损压缩方法,可以保留原始数据的每一个像素信息,不会因为压缩而损失图像质量。 2. **透明性**:PNG支持两种透明级别,即索引透明...
PNG格式是一种基于8位或16位颜色深度的无损压缩格式,支持透明度(Alpha通道)和多种颜色模式。YUV则是一种色彩空间,通常用在JPEG和视频编码中,分为多种变体,如YUV4:2:0、YUV4:2:2、YUV4:4:4等。在YUV中,Y代表...
1. **PNG文件结构**:PNG文件以8字节的PNG签名开始,接着是图像头部信息(IHDR),包括图像宽度、高度、颜色类型、位深度等。之后还有可能包含多个数据块,如图像数据(IDAT)、颜色表(PLTE)、透明度信息(tRNS)...
6. 保存为PNG文件:最后,将PNG图像对象保存到磁盘上,生成一个具有相同内容但格式为.png的新文件。 在实际应用中,`gnt2png.py`可能还提供了命令行参数,允许用户指定输入文件、输出文件、转换选项等。例如,你...
- 转换过程:此工具简化了PNG与ICO之间的转换步骤,用户只需选择要转换的PNG文件,然后设置输出的ICO文件参数(如尺寸和颜色深度),点击转换按钮即可完成。 - 功能特点:该工具可能具有批量转换功能,允许用户一...
将pkm格式图片转为png图片。 解压目录后,放在pkm图片同目录下即可,双击执行 pkm convert to png.bat 文件。 作者: https://github.com/zhukunqian
在MFC(Microsoft Foundation Class)库中,读取并显示...总的来说,要在MFC中实现PNG文件的读取和显示,你需要理解PNG文件格式,熟悉第三方库的使用,以及掌握MFC控件和绘图API。这是一个涉及多方面技术的综合实践。
mat文件转png文件
我们都知道,在进行J2ME的手机应用程序开发的时候,在图片的使用上,我们可以使用PNG格式的图片(甚至于在有的手机上,我们只可以使用PNG格式的图片),尽管使用图片可以为我们的应用程序增加不少亮点,然而,只支持...
而`.png`(Portable Network Graphics)则是一种无损压缩的图像文件格式,支持透明度,并且在网页和各种应用程序中非常常见。本篇文章将深入探讨如何批量将`.pvr.ccz`文件转换为`.png`格式,以及涉及的相关技术。 ...
文件夹中的文件root/img/logo.png可以通过以下方式访问bundle.read("img/logo.png") == Uint8Array 辅助方法允许用户读取所需的数据格式。 var d = bundle.readJSON("data/file.json") == object var s = bundle....
开发者可能已经实现了将用户指定的PNG文件读取,转换为WebP格式,并保存到磁盘的功能。 转换过程通常包括以下步骤: 1. 读取PNG文件:程序首先需要解析PNG文件的结构,提取图像数据和元数据。 2. 转换图像:使用...
本教程将详细介绍如何使用GDAL库将TIFF文件转换为更常见的bmp和png格式,并对图像进行压缩,以解决大文件可能导致的内存问题。 首先,我们需要了解GDAL的基本用法。GDAL不仅提供了命令行工具,还有一套C++ API,...
"dds2png"工具就是专门针对这种需求设计的,能够批量将DDS文件转换为PNG文件,极大地提高了工作效率。 DDS到PNG的转换过程涉及到以下几个关键知识点: 1. 图像格式转换:不同的图像格式有不同的存储方式和压缩算法...