|
|

楼主 |
发表于 2007-2-8 12:21:00
|
显示全部楼层
Re:【PNG overview】PNG专题!
2.PNG格式四大金刚
PNG必需的关键数据块主要是有四分组成,分别是IHDR,PLTE,IDAT,IEND ,其中PLTE 数据块只是和索引彩色图像有关的,如果是RGB格式的PNG,里面可以没有PLTE数据。这样来说其实PNG数据的主要分就是三部分IHDR,IDAT,IEND-----分别是文件头,数据部分和文件结尾。
IHDR
(看不到图片请点击查看原文)文件头数据块IHDR(header chunk):它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。
文件头数据块由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遍隔行扫描方法)
现在用UltraEdit-32打开上面的那张PNG格式测试图,我们开始分析它的数据结构。
此主题相关图片如下:
(看不到图片请点击查看原文)
被红色选中的头8个字节即为PNG文件的标识,它说名了这个文件是一个PNG文件。
除了被红色选中的以外的白色部分,就是IHDR自身描述的数据块了
00 00 00 0D 说明IHDR头块长为13
49 48 44 52 IHDR标识
00 00 01 00 图像的宽,256像素
00 00 01 00 图像的高,256像素
08 色深
02 颜色类型,真彩色图像
00 PNG Spec规定此处总为0(非0值为将来使用更好的压缩方法预留),表示使压缩方法(LZ77派生算法)
00 同上
00 非隔行扫描
最后的4位数据是 CRC校验码 确保以上数据的完整性
PLTE
调色板数据块PLTE(palette chunk)包含有与索引彩色图像(indexed-color image)相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前。
PLTE数据块是定义图像的调色板信息,PLTE可以包含1~256个调色板信息,每一个调色板信息由3个字节组成:
(看不到图片请点击查看原文)
颜色
字节
意义
Red
1 byte
0 = 黑色, 255 = 红
Green
1 byte
0 = 黑色, 255 = 绿色
Blue
1 byte
0 = 黑色, 255 = 蓝色
因此,调色板的长度应该是3的倍数,否则,这将是一个非法的调色板。
对于索引图像,调色板信息是必须的,调色板的颜色索引从0开始编号,然后是1、2……,调色板的颜色数不能超过色深中规定的颜色数(如图像色深为4的时候,调色板中的颜色数不可以超过2^4=16),否则,这将导致PNG图像不合法。
真彩色图像和带α通道数据的真彩色图像也可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。
因为这张测试图片是真彩图像,所以没有PLTE数据块。
IDAT
(看不到图片请点击查看原文)
图像数据块IDAT(image data chunk):它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。
IDAT存放着图像真正的数据信息,因此,如果能够了解IDAT的结构,我们就可以很方便的生成PNG图像。
此主题相关图片如下:
(看不到图片请点击查看原文)
在这留白的部分就是我们的IDAT数据部分
红色选中部分表示IDAT数据块的长度
黄色部分49 44 41 54 IDAT标识
78 DA…… 压缩的数据,LZ77派生压缩方法
绿色部分是 CRC校验
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文件中识别出各个数据块了。由于PNG中规定除关键数据块外,其它的辅助数据块都为可选部分,因此,有了这个标准后,我们可以通过删除所有的辅助数据块来减少PNG文件的大小。(当然,需要注意的是,PNG格式可以保存图像中的层、文字等信息,一旦删除了这些辅助数据块后,图像将失去原来的可编辑性。)
比如说下面这个图形数据,里面除了我们上面所提到的四块数据以外,还有很多的辅助数据
(看不到图片请点击查看原文)
3.PNG格式的天兵天将
我们选择网上的一张图片作为讲解PNG辅助格式的图片素材,这个素材是8*8的,看起来很小,放大以后效果如下图,不过查看数据格式的时候还是要用UltraEdit-32打开。
主要的数据块我们就不讲了,现在看看辅助数据
00000021~0000002F:
(看不到图片请点击查看原文)
可选数据块sBIT,颜色采样率,RGB都是256(2^8=256)
00000030~00000062:
(看不到图片请点击查看原文)
这里是调色板信息
00 00 00 27 说明调色板数据长为39字节,既13个颜色数
50 4C 54 45 PLTE标识 (开始那张图片上面没有PLTE数据块,这张图片有)
FF FF 00 颜色0
FF ED 00 颜色1
…… ……
09 00 B2 最后一个颜色,12
5F F5 BB DD CRC校验
00000063~000000C5:
(看不到图片请点击查看原文)
这部分包含了pHYs、tExt两种类型的数据块共3块,由于并不太重要,因此也不再详细描述了。
|
|