yzjcomcn

统计

留言簿

阅读排行榜

评论排行榜

png图片格式分析

                                                             Png 格式分析

   现在j2me中能够用到的图片格式一般是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

图像最后修改时间数据块

否

是

无限制

tEXt

文本信息数据块

是

是

无限制

zTXt

压缩文本数据块

是

是

无限制

fRAc

(专用公共数据块)

是

是

无限制

gIFg

(专用公共数据块)

是

是

无限制

gIFt

(专用公共数据块)

是

是

无限制

gIFx

(专用公共数据块)

是

是

无限制

IEND

图像结束数据

否

否

最后一个数据块

Png图片数据块列表

     Png格式是由四个关键数据块和一些辅助数据块组成,四个关键数据块是必需的。有了它们就可以组成一张png图片,这四个关键数据块就是:

文件头数据块(IHDR)、调色板数据块(PLTE)、图象数据块(IDAT)、图象结束数据块(IEND)。为了使图象的背景色透明,获得更好的效果,我建议还要将tRNS这个数据块加上。原来我在手机上就用四个关键数据块合成一张图片,放到手机上背景色不透明,效果不好,加上tRNS这个数据块就背景色透明。

每个png图片的数据块的结构都是一样的。结构图如下:

名称

字节数

说明

Length (长度)

4字节

指定数据块中数据域的长度,其长度不超过(231-1)字节

Chunk Type Code (数据块类型码)

4字节

数据块类型码由ASCII字母(A-Z和a-z)组成

Chunk Data (数据块数据)

可变长度

存储按照Chunk Type Code指定的数据

CRC (循环冗余检测)

4字节

存储用来检测是否有错误的循环冗余码

 

CRC域中的值是对Chunk Type Code域和Chunk Data域中的数据进行计算得到的。

每个数据块都是由这些数据域组成的。

IHDR

文件头数据块IHDR(header chunk):它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。

对于一个PNG文件来说,png图片的标志位:

十进制数

137 80 78 71 13 10 26 10

十六进制数

89 50 4E 47 0D 0A 1A 0A

文件头数据块由13字节组成,它的格式如下表所示。

域的名称

字节数

说明

Width

4 bytes

图像宽度,以像素为单位

Height

4 bytes

图像高度,以像素为单位

Bit depth

1 byte

图像深度:
索引彩色图像:1,2,4或8
灰度图像:1,2,4,8或16
真彩色图像:8或16

ColorType

1 byte

颜色类型:
0
:灰度图像, 1,2,4,8或16
2
:真彩色图像,8或16
3
:索引彩色图像,1,2,4或8
4
:带α通道数据的灰度图像,8或16
6
:带α通道数据的真彩色图像,8或16

Compression method

1 byte

压缩方法(LZ77派生算法)

Filter method

1 byte

滤波器方法

Interlace method

1 byte

隔行扫描方法:
0
:非隔行扫描
1
: Adam7(由Adam M. Costello开发的7遍隔行扫描方法)

 

PLTE

调色板数据块PLTE(palette chunk)包含有与索引彩色图像(indexed-color image)相关的彩色变换数据,它仅与索引彩色图像有关。PLTE数据块是定义图像的调色板信息,PLTE可以包含1~256个调色板信息,每一个调色板信息由3个字节组成:

颜色

字节

意义

Red

1 byte

0 = 黑色, 255 = 红

Green

1 byte

0 = 黑色, 255 = 绿色

Blue

1 byte

0 = 黑色, 255 = 蓝色

因此,调色板的长度应该是3的倍数。

并不是所有的png格式的图片都有调色板数据块,真彩色图片可能就没有。

IDAT

图像数据块IDAT(image data chunk):它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。

IDAT存放着图像真正的数据信息,因此,如果能够了解IDAT的结构,我们就可以很方便的生成PNG图像。

IEND

图像结束数据IEND(image trailer chunk):它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。

如果我们仔细观察PNG文件,我们会发现,文件的结尾12个字符看起来总应该是这样的:

00 00 00 00 49 45 4E 44 AE 42 60 82

不难明白,由于数据块结构的定义,IEND数据块的长度总是0(00 00 00 00,除非人为加入信息),数据标识总是IEND(49 45 4E 44),因此,CRC码也总是AE 42 60 82。

上面是png格式图片的四个关键数据块, 暂时分析到这。

 

 

 

 

 

posted on 2005-05-04 22:33 古行客 阅读(2702) 评论(4)  编辑  收藏

评论

# re: png图片格式分析 2006-07-07 10:19 800电话防伪 渐变数码 双码防伪防窜货 128条码 0551-5336491



经典  回复  更多评论   

# re: png图片格式分析 2007-11-25 20:23 彼岸

非常感谢呀!  回复  更多评论   

# re: png图片格式分析 2007-11-25 20:25 彼岸

有没有后续呢?我现在要做一个程序,把四个png图片合并成一个  回复  更多评论   

# 清晰明了 2012-03-31 10:30 Vency

楼主写的太正了!感谢分享。
能对IDAT进一步分析一下吗?或者有相关材料推荐?  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: