我们都知道,在进行 J2ME 的手机应用程序开发的时候,在图片的使用上,我们可以使用 PNG 格式
的图片(甚至于在有的手机上,我们只可以使用 PNG 格式的图片),尽管使用图片可以为我们的应
用程序增加不少亮点,然而,只支持 PNG 格式的图片却又限制了我们进一步发挥的可能性(其实,
应该说是由于手机平台上的处理能力有限)。 在 MIDP2 中,或者某些厂商(如 NOKIA)提供的 API
中,提供了 drawPixels/getPixels 的方法,这些方法进一步提高了开发者处理图片的灵活性,然而,
在 MIDP2 还未完全普及的今天,我们需要在 MIDP1 .0 中实现这类方法还属于异想天开,因此,为了
实现更高级的应用,我们必须充分挖掘 PNG 的潜力。
PNG 的文件结构
对于一个 PNG 文件来说,其文件头总是由位固定的字节来描述的:
十进制数
137 80 78 71 13 10 26 10
十六进制数
89 50 4E 47 0D 0A 1A 0A
其中第一个字节 0x89 超出了 ASCII 字符的范围,这是为了避免某些软件将 PNG 文件当做文本文件
来处理。文件中剩余的部分由 3 个以上的 PNG 的数据块(Chunk)按照特定的顺序组成,因此,一
个标准的 PNG 文件结构应该如下:
PNG 文件标志
PNG 数据块
……
PNG 数据块
PNG 数据块(Chunk)
PNG 定义了两种类型的数据块,一种是称为关键数据块(critical chunk),这是标准的数据块,另一种
叫做辅助数据块(ancillary chunks),这是可选的数据块。关键数据块定义了 4 个标准数据块,每个
PNG 文件都必须包含它们,PNG 读写软件也都必须要支持这些数据块。虽然 PNG 文件规范没有要
求 PNG 编译码器对可选数据块进行编码和译码,但规范提倡支持可选数据块。
下表就是 PNG 中数据块的类别,其中,关键数据块部分我们使用深色背景加以区分。
PNG 文件格式中的数据块
数据块符号
数据块名称
多数据块
可选否
位置限制
IHDR
文件头数据块
否
否
第一块
cHRM
基色和白色点数据块
否
是
在 PLTE 和 IDAT 之前
gAMA
图像 γ 数据块
否
是
在 PLTE 和 IDAT 之前
sBIT
样本有效位数据块
否
是
在 PLTE 和 IDAT 之前
PLTE
调色板数据块
否
是
在 IDAT 之前
bKGD
背景颜色数据块
否
是
在 PLTE 之后 IDAT 之前
hIST
图像直方图数据块
否
是
在 PLTE 之后 IDAT 之前
tRNS
图像透明数据块
否
是
在 PLTE 之后 IDAT 之前
oFFs
(专用公共数据块)
否
是
在 IDAT 之前
pHYs
物理像素尺寸数据块
否
是
在 IDAT 之前
sCAL
(专用公共数据块)
否
是
在 IDAT 之前
IDAT
图像数据块
是
否
与其他 IDAT 连续
tIME
图像最后修改时间数据块
否
是
无限制