png图片的文件存储格式

来源:互联网 发布:mysql utf 8 乱码 编辑:程序博客网 时间:2024/05/17 02:41

 

图形图像的位图格式—PNG格式

图形图像的位图格式—PNG格式

PNG是20世纪90年代中期形成的图像文件存储格式,其目的是企图代替GIF和TIFF文件格式,同时增加一些GIF文件格式所不具有的特性。开始时,并没有多少人知道,直到1996年10月1日由PNG向国际网络联盟(World Wide Web Consortiun)提出,并推荐认可标准,并且大部分绘图软件支持PNG这种格式。从此PNG图像格式生机焕发。PNG是一种无损压缩的位图文件。用来存储灰度图像时,灰度图像的深度可多到16位;存储彩色图像时,彩色图像的深度可多大48位;并且还可以存储多达16位的α通道数据。PNG使用从LZ77派生的无损数据压缩算法。因而,PNG文件的结构,特性以及未来引起人们的关注。

一.         PNG的文件结构

PNG图像格式文件(或者称为数据流)由一个8字节的PNG文件署名(PNG file signature)域和按照特定结构组织的3个以上的数据块(chunk)组成。

PNG定义了两种类型的数据块,一种是称为关键数据块(critical chunk),这是标准的数据块;另一种叫做辅助数据块(ancillary chunk),这是可选的数据块. 关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们.

1.PNG文件署名域

8字节的PNG文件署名域用来识别该文件是不是PNG文件。该域的值是:

十进制数13780787113102610

十六进制数89504e470d0a1a0a

2.数据块的结构

每个数据块都由表1所示的的4个域组成。

注:在表1中,CRC(cyclic redundancy check)域中的值是对Chunk Type Code域和Chunk Data域中的数据进行计算得到的。CRC具体算法定义在ISO3309和ITU-TV.42中,其值按下面的CRC码生成多项式进行计算:

x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1(x^n表示x的n次方)

1) 关键数据块

关键数据块中的4个标准数据块是:

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

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

注:表2 PNG文件头数据块的结构

域的名称字节数说明

Width4bytes图像宽度:以像素为单位

Height4bytes图像高度:以像素为单位

Bitdepth1byte图像深度:

索引彩色图像,1,2,4或8

灰度图像,1,2,4,8或16

真彩色图像,8或16

ColorType1byte颜色类型:

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(由AdamM.Costello开发的7遍隔行扫描方法)

(2)调色板数据块PLTE(palettchunk):它包含有与索引彩色图像((indexed-colorimage))相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前。真彩色的PNG数据流也可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。调色板数据块结构如表3所示。

注:表3调色板数据块结构

域的名称字节数说明

Red1byte0=黑,255=红

Green>0=黑,255=绿

Blue1byte0=黑,255=蓝

 调色板实际是一个彩色索引查找表,它的表项数目可以是1~256中的一个数,每个表项有3字节,因此调色板数据块所包含的最大字节数为768。

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

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

除了表示数据块开始的IHDR必须放在最前面,表示PNG文件结束的IEND数据块放在最后面之外,其他数据块的存放顺序没有限制。

2)辅助数据块

PNG文件格式规范制定的10个辅助数据块是:

(1)背景颜色数据块bKGD(background color)。

(2)基色和白色度数据块cHRM(primary chromaticities and white

point)。所谓白色度是指当R=G=B=最大值时在显示器上产生的白色度。

(3)图像γ数据块gAMA(image gamma)。

(4)图像直方图数据块hIST(image histogram)。

(5)物理像素尺寸数据块pHYs(physical pixel dimensions)。

(6)样本有效位数据块sBIT(significant bits)。

(7)文本信息数据块tEXt(textual data)。

(8)图像最后修改时间数据块tIME(image lastmodification time)。

(9)图像透明数据块tRNS(transparency)。

(10)压缩文本数据块zTXt(compressed textual data)。

二.PNG的文件特性

一)PNG保留的特性:

  1、使用彩色查找表或者叫做调色板可支持256种颜色的彩色图像。

  2、流式读/写性能(streamability):图像文件格式允许连续读出和写入图像数据,这个特性很适合于在通信过程中生成和显示图像。

  3、逐次逼近显示(progressive display):这种特性可使在通信链路上传输图像文件的同时就在终端上显示图像,把整个轮廓显示出来之后逐步显示图像的细节,也就是先用低分辨率显示图像,然后逐步提高它的分辨率。

  4、透明性(transparency):这个性能可使图像中某些部分不显示出来,用来创建一些有特色的图像。

  5、辅助信息(ancillary information):这个特性可用来在图像文件中存储一些文本注释信息。

  6、独立于计算机软硬件环境。

  7、使用无损压缩。

  二)PNG增加的特性:

  1、每个像素为48位的真彩色图像。

  2、每个像素为16位的灰度图像。

  3、可为灰度图和真彩色图添加α通道。

  4、添加图像的γ信息。

  5、使用循环冗余码(cyclic redundancy code,CRC)检测损害的文件。

  6、加快图像显示的逐次逼近显示方式。

  7、标准的读/写工具包。

  8、可在一个文件中存储多幅图像。

三)PNG的优点:

1.图像压缩方面

  在图像处理中,位图图像的压缩分为无损压缩和有损压缩两大类。PNG属于无损压缩一类;因而,最后保存下来的图像,其大小会因为压缩而减小,但图像的质量却不会因为压缩而缺损。

2.色彩丰富程度

  PNG支持所有色彩类型,更可以提供64位/像素的高品质图像形式。所以,在色彩选择上有更大的适用性。

3.制作透明图像

  PNG有支持alpha透明的属性。它能提供创作者指定透明色和透明区域的选择性透明。

4.平台适用性

  目前的电脑使用的平台大部分为PC和MAC。而这两个平台在色彩显示上是有区别的,因而,图像很容易在平台间形成差别——例如,在PC上显得太暗而在MAC上显得太亮。PNG允许了计算机自动使用gamma色彩修正来修正图像的显示,这样在不同的平台,可以根据应用程序的需要显示出适合的图像,这为跨平台的网页图像提供了较好的解决方案。

5.远程协作

  PNG保留了图像的层属性,因而可以很方便的进行网络远程协作维护。使用PNG,只要用编辑器打开当前的图像后,就可以很方便的进行修改了。总的来说,PNG并不仅仅是一个可应用于图像扫描和编辑中介的格式,更是一个非常适合网络传输和应用的图像格式。PNG能在具有调色板和灰阶的图像上获得自身的优势。

四)PNG的缺点:

  1.PNG不支持动画应用效果。

  2. PNG对于照片的优化不好。

三.PNG的未来发展

一方面,我们都知道网络图像中(不包括swf)GIF除了制作静态图像以外还可以制作动态图像,这是目前位图里唯一能实现此功能的格式。而对于PNG,现在虽然还做不到这点,但目前已经有相关的开发针对这方面的功能,这就是新的标准——MNG(Multipleimage network graphics)多重影像网络图像格式。因而这是一个充满希望的发展方向。另一方面,我们又很沉重的看到,今天的网络图像都面临了目前已经形成工业标准,并具有初步开发和应用的SVG格式的挑战。相对于采用矢量格式和XML语言架构的未来网络图像标准格式—SVG而言,PNG受到自身的限制。

 

了解PNG格式

述文 2009-10-12 18:56:11 阅读17 评论0   字号: 订阅

PNG是20世纪90年代中期开始开发的图像文件存储格式,其目的是企图替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性。流式网络图形格式(Portable Network Graphic Format,PNG)名称来源于非官方的“PNG's Not GIF”,是一种位图文件(bitmap file)存储格式,读成“ping”。PNG用来存储灰度图像时,灰度图像的深度可多到16位,存储彩色图像时,彩色图像的深度可多到48位,并且还可存储多到16位的α通道数据。PNG使用从LZ77派生的无损数据压缩算法。

PNG文件格式保留GIF文件格式的下列特性:

  1. 使用彩色查找表或者叫做调色板可支持256种颜色的彩色图像。
  2. 流式读/写性能(streamability):图像文件格式允许连续读出和写入图像数据,这个特性很适合于在通信过程中生成和显示图像。
  3. 逐次逼近显示(progressive display):这种特性可使在通信链路上传输图像文件的同时就在终端上显示图像,把整个轮廓显示出来之后逐步显示图像的细节,也就是先用低分辨率显示图像,然后逐步提高它的分辨率。
  4. 透明性(transparency):这个性能可使图像中某些部分不显示出来,用来创建一些有特色的图像。
  5. 辅助信息(ancillary information):这个特性可用来在图像文件中存储一些文本注释信息。
  6. 独立于计算机软硬件环境。
  7. 使用无损压缩。

 

PNG文件格式中要增加下列GIF文件格式所没有的特性:

  1. 每个像素为48位的真彩色图像。
  2. 每个像素为16位的灰度图像。
  3. 可为灰度图和真彩色图添加α通道。
  4. 添加图像的γ信息。
  5. 使用循环冗余码(cyclic redundancy code,CRC)检测损害的文件。
  6. 加快图像显示的逐次逼近显示方式。
  7. 标准的读/写工具包。
  8. 可在一个文件中存储多幅图像。

 

文件结构

 

PNG图像格式文件(或者称为数据流)由一个8字节的PNG文件署名(PNG file signature)域和按照特定结构组织的3个以上的数据块(chunk)组成。

PNG定义了两种类型的数据块,一种是称为关键数据块(critical chunk),这是标准的数据块,另一种叫做辅助数据块(ancillary chunks),这是可选的数据块。关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们,PNG读写软件也都必须要支持这些数据块。虽然PNG文件规范没有要求PNG编译码器对可选数据块进行编码和译码,但规范提倡支持可选数据块。

(1) PNG文件署名域

8字节的PNG文件署名域用来识别该文件是不是PNG文件。该域的值是: 十进制数13780787113102610十六进制数89504e470d0a1a0a

 

(2) 数据块的结构

每个数据块都由表6-07所示的的4个域组成。

 

表6-07 PNG文件数据块的结构

 

名称

 

字节数

 

说明

Length(长度)4字节指定数据块中数据域的长度,其长度不超过

 

(231-1)字节

Chunk Type Code(数据块类型码)4字节数据块类型码由ASCII字母(A-Z和a-z)组成Chunk Data(数据块数据)可变长度存储按照Chunk Type Code指定的数据CRC(循环冗余检测)4字节存储用来检测是否有错误的循环冗余码

 

 

在表6-07中,CRC(cyclic redundancy check)域中的值是对Chunk Type Code域和Chunk Data域中的数据进行计算得到的。CRC具体算法定义在ISO 3309和ITU-T V.42中,其值按下面的CRC码生成多项式进行计算:

x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1

 

数据块结构

 

1. 关键数据块

关键数据块中的4个标准数据块是:

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

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

 

表6-08 PNG文件头键数据块的结构

 

域的名称

 

字节数

 

说明

Width4 bytes图像宽度,以像素为单位Height4 bytes图像高度,以像素为单位Bit depth1 byte图像深度:

 

索引彩色图像:1,2,4或8

灰度图像:1,2,4,8或16

真彩色图像:8或16

ColorType1 byte颜色类型:

 

0:灰度图像, 1,2,4,8或16

2:真彩色图像,8或16

3:索引彩色图像,1,2,4或8

4:带α通道数据的灰度图像,8或16

6:带α通道数据的真彩色图像,8或16

Compression method1 byte压缩方法(LZ77派生算法)Filter method1 byte滤波器方法Interlace method1 byte隔行扫描方法:

 

0:非隔行扫描

1: Adam7(由Adam M. Costello开发的7

遍隔行扫描方法)

 

 

(2) 调色板数据块PLTE(palette chunk):它包含有与索引彩色图像((indexed-color image))相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前。真彩色的PNG数据流也可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。调色板数据块结构如表6-09所示。

 

表6-09 调色板数据块结构

 

域的名称

 

字节数

 

说明

Red1 byte0 = 黑,255 = 红Green">

 

0 = 黑,255 = 绿

Blue1 byte0 = 黑,255 = 蓝

 

 

调色板实际是一个彩色索引查找表,它的表项数目可以是1~256中的一个数,每个表项有3字节,因此调色板数据块所包含的最大字节数为768。

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

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

除了表示数据块开始的IHDR必须放在最前面, 表示PNG文件结束的IEND数据块放在最后面之外,其他数据块的存放顺序没有限制。

2. 辅助数据块

PNG文件格式规范制定的10个辅助数据块是:

(1) 背景颜色数据块bKGD(background color)。

(2) 基色和白色度数据块cHRM(primary chromaticities and white point)。所谓白色度是指当R=G=B=最大值时在显示器上产生的白色度。

(3) 图像γ数据块gAMA(image gamma)。

(4) 图像直方图数据块hIST(image histogram)。

(5) 物理像素尺寸数据块pHYs(physical pixel dimensions)。

(6) 样本有效位数据块sBIT(significant bits)。

(7) 文本信息数据块tEXt(textual data)。

(8) 图像最后修改时间数据块tIME (image last-modification time)。

(9) 图像透明数据块tRNS (transparency)。

(10) 压缩文本数据块zTXt (compressed textual data)。

3. 数据块摘要

关键数据块、辅助数据块和专用公共数据块(special-purpose public chunks)综合在表6-10中。

 

表6-10 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图像结束数据

 

 

最后一个数据块

 

 

tEXt和zTXt数据块中的标准关键字:

 

Title

 

图像名称或者标题

 

Author

 

图像作者名

 

Description

 

图像说明

 

Copyright

 

版权声明

 

CreationTime

 

原图创作时间

 

Software

 

创作图像使用的软件

 

Disclaimer

 

弃权

 

Warning

 

图像内容警告

 

Source

 

创作图像使用的设备

 

Comment

 

各种注释

 

     

 

     --------------------------------------------------------------

5.2.3  分析PNG图像文件结构(1)

-------------------------------------------------------------

结合上面对PNG文件的分析,下面分别对256色和16位色的PNG图像进行十六进制分析,通过分析PNG文件让读者更深入了解PNG文件格式。

如图5-15和图5-16所示,分别为256色PNG图像pic1.png和16位色PNG图像pic2.png。其中pic1.png图像的分辨率为200×150,文件大小为19 534 字节。pic2.png图像的分辨率为200×150,文件大小为104 744字节,带透明通道。

498)this.style.width=498;" border=0>图5-15  pic1.png图像498)this.style.width=498;" border=0> 图5-16  pic2.png图像现在来分析pic1.png的图像文件,在Winhex中打开pic1.png,如图5-17所示。
498)this.style.width=498;" border=0> (点击查看大图)图5-17  在Winhex中打开pic1.png文件首先分析PNG的文件标志。根据PNG文件的定义,从文件头开始前8字节数据是PNG文件的标志,如图5-18所示。
498)this.style.width=498;" border=0> (点击查看大图)图5-18  PNG文件的文件标志接下来应该就是PNG文件的数据块结构了,按照前面对PNG文件结构的分析,第一个数据块应该是文件头数据块(IHDR)数据块,文件头数据块(IHDR)定义了PNG文件的宽高、色深、压缩方法等参数,如图5-19所示。
498)this.style.width=498;" border=0> (点击查看大图)图5-19  文件头数据块(IHDR)结构

 

 

     --------------------------------------------------------------

5.2.3  分析PNG图像文件结构(2)

------------------------------------------------------------- 

 

表5-15归纳了pic1.png图像文件中文件头数据块(IHDR)中各字段的含义。由于PNG文件使用Big-Endian顺序存储数据,所以不需要反转字节数据理解。

表5-15 pic1.png图像文件中文件头数据块(IHDR)的各字段含义


十六进制值

描    述

00 00 00 0D

文件头的数据长度,00 00 00 0D =13

49 48 44 52

数据块类型标志,49 48 44 52的ASCII值等于IHDR

00 00 00 C8

图像的宽度,00 00 00 C8 = 200

00 00 00 96

图像的高度,00 00 00 96 = 150

08

色深,表示2的8次幂等于256色

03

03表示索引图像

00

00表示使用Deflate压缩编码压缩图像数据

00

00表示为将来使用更好的压缩方法预留

00

00表示非隔行扫描

AC 02 37 2B

AC 02 37 2B表示CRC

从表5-14看到pic1.png文件的文件头数据块(IHDR)结构中的CRC字段的值为AC 02 37 2B,这个CRC值是按照从数据块类型标志字段到CRC字段前一字节的数据计算而来的,即使用数据49 48 44 52 00 00 00 C8 00 00 00 96 08 03 00 00 00计算,CRC的计算代码如下:

   /*8位消息的CRC表格*/
unsigned long crc_table[256];
/*Flag:CRC表格计算完了吗?初始化 False*/
int crc_table_computed = 0;
/*写一个CRC表格*/
void make_crc_table(void)
{
unsigned long c;
int n, k;
for (n = 0; n < 256; n++) {
c = (unsigned long) n;
for (k = 0; k < 8; k++) {
if (c & 1)
c = 0xedb88320L ^ (c >> 1);
else
c = c >> 1;
}
crc_table[n] = c;
}
crc_table_computed = 1;
}
/*使用bu[0..len-1]更新CRC表格*/
unsigned long update_crc(unsigned long crc, unsigned char *buf,
int len)
{
unsigned long c = crc;
int n;
if (!crc_table_computed)
make_crc_table();
for (n = 0; n < len; n++) {
c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8);
}
return c;
}
/* 返回 CRC表格buf[0..len-1]. */
unsigned long crc(unsigned char *buf, int len)
{
return update_crc(0xffffffffL, buf, len) ^ 0xffffffffL;
}
main()
{
/*计算CRC需要的初始化数据,不同的数据块有不同的初始化数据*/
unsigned char buf[17] = {
0x49,0x48,0x44,0x52,0x00,0x00,0x00,0xC8,0x00,
0x00,0x00,0x96,0x08,0x03,0x00,0x00,
0x00
};
unsigned long value=0;
value= crc(buf,17);
}

继续分析下面的数据块,PNG图像文件的数据块类型由数据块类型标志决定,按照PNG图像文件中数据块的数据结构分析,接下来的数据块是物理像素尺寸数据块(pHYs),物理像素尺寸数据块(pHYs)指定像素大小或图像的宽和高的比例。

表5-16所示为物理像素尺寸数据块(pHYs)中各字段的含义。

表5-16 物理像素尺寸数据块(pHYs) 中各字段的含义

字  段  名

大小(单

位:字节)

描    述

physPixelPerUnitX

4

每单位多少像素,x轴

physPixelPerUnitY

4

每单位多少像素,y轴

UnkownUnit ,Meter

1

枚举类型,UnkownUnit=0,表示只定义了像素显示的比例,未定义实际像素大小。

枚举类型,Meter=1,表示定义单位为米

物理像素尺寸数据块(pHYs)的结构可以用以下代码定义:

PNG_CHUNK_HEADER chunkHdr ;
uint physPixelPerUnitX;
uint physPixelPerUnitY;
enum {
UnkownUnit = 0,
Meter = 1
} pHYs;
DWORD pHYsCrc;
图5-20所示为pic1.png中的物理像素尺寸数据块(pHYs)的结构。
498)this.style.width=498;" border=0> (点击查看大图)图5-20  pic1.png中的物理像素尺寸数据块(pHYs)的结构

 

-------------------------------------------------------------

5.2.3  分析PNG图像文件结构(3)

-------------------------------------------------------------  

表5-17所示为pic1.png图像文件中物理像素尺寸数据块(pHYs)中各字段的含义。

表5-17 pic1.png图像文件中物理像素尺寸数据块(pHYs)中各字段的含义


十六进制值

描    述

00 00 00 09

物理像素尺寸数据块的长度,00 00 00 09 =9

70 48 59 73

数据块类型标志,70 48 59 73的ASCII值等于pHYs

00 00 0B 13

x轴上每米像素的数量,00 00 0B 13 = 2835,即每米2835个像素

00 00 0B 13

y轴上每米像素的数量,00 00 0B 13 = 2835,即每米2835个像素

01

Meter=1,将单位定义为米

00 9A 9C 18

CRC值

继续分析下面的数据,按照前面的分析方法,分析出接下来的数据块是iCCP,iCCP数据块是PNG解码时进行特殊的颜色处理信息。

iCCP数据块的结构可以用以下代码定义:

PNG_CHUNK_HEADER chunkHdr
typedef struct {
string profile_name;
unsigned byte red;
} PNG_ICCP_CHUNK_DATA;
DWORD ICCPCrc;
图5-21所示为pic1.png中的iCCP的数据结构。
498)this.style.width=498;" border=0> (点击查看大图)图5-21  pic1.png图像文件中iCCP数据块结构498)this.style.width=498;" border=0> (点击查看大图)图5-21  pic1.png图像文件中iCCP数据块结构


表5-18所示为pic1.png图像文件中的iCCP数据块各字段的含义。

表5-18 pic1.png图像文件中的iCCP数据块各字段的含义

十六进制值

描    述

00 00 0A 4D

ICCP数据块的长度,00 00 0A 4D = 2637

69 43 43 50

数据块类型标志,69 43 43 50的ASCII值等于iCCP

50 68 6F 74 6F 73 68 6F 70 20 49 43 43 20 70 72 6F 66 69 6C 65 00

配置文件名,长度1~79字节,以0作为终止符的字符串。

50 68 6F 74 6F 73 68 6F 70 20 49 43 43 20 70 72 6F 66 69 6C 65 00 的ASCII值等于Photoshop ICC profile

00

压缩方法,0表示使用deflate压缩

78 DA 9D 53~F7 84 F3 FB

压缩后的配置文件,解码时使用

继续分析下面的数据,按照前面的分析方法,分析出接下来的数据块是gAMA,gAMA数据块是PNG解码时进行gamma校正的信息。

gAMA数据块的结构可以用以下代码定义:

PNG_CHUNK_HEADER chunkHdr;
BYTE gamaChunkData[chunkHdr.btChunkLen];
DWORD gamaCrc;
图5-22所示为pic1.png中的gAMA的数据结构:
498)this.style.width=498;" border=0> (点击查看大图)图5-22  pic1.png图像文件中gAMA数据块结构

 

 

  --------------------------------------------------------------

5.2.3  分析PNG图像文件结构(4)

-------------------------------------------------------------

    表5-19所示为pic1.png图像文件中的gAMA数据块各字段的含义。

表5-19 pic1.png图像文件中的gAMA数据块各字段的含义


十六进制值

描    述

00 00 00 04

gAMA数据块的长度,00 00 00 04 = 4

67 41 4D 41

数据块类型标志,67 41 4D 41的ASCII值等于gAMA

00 00 B1 8E

gamma校正信息

7C F8 51 93

CRC值

继续分析下面的数据,按照前面的分析方法,分析出接下来的数据块是cHRM,cHRM是在设备不能够显示正确的颜色时,使图像尽可能校正颜色的信息,也叫做设备无关的颜色信息。

cHRM数据块的结构可以用以下代码定义:

typedef struct {
uint x;
uint y;
} PNG_POINT;
typedef struct {
PNG_POINT white;
PNG_POINT red;
PNG_POINT green;
PNG_POINT blue;
} PNG_CHRM_CHUNK_DATA;
PNG_CHUNK_HEADER chunkHdr;
PNG_CHRM_CHUNK_DATA chrmChunkData;
DWORD chrmCrc;
图5-23所示为pic1.png中的cHRM的数据结构。
498)this.style.width=498;" border=0> (点击查看大图)图5-23  pic1.png图像文件中cHRM数据块结构

表5-20所示为pic1.png图像文件中的cHRM数据块各字段的含义。

表5-20 pic1.png图像文件中的cHRM数据块各字段的含义


十六进制值

描    述

00 00 00 20

cHRM数据块的长度,00 00 00 20 = 32

63 48 52 4D

数据块类型标志,63 48 52 4D的ASCII值等于cHRM

00 00 7A 25

白色点的x轴坐标,00 00 7A 25 = 31269

续表


十六进制值

描    述

00 00 80 83

白色点的y轴坐标,00 00 80 83 = 32899

00 00 F9 FF

红x坐标,00 00 F9 FF = 63999

00 00 80 E9

红y坐标,00 00 80 E9 = 33001

00 00 75 30

绿x坐标,00 00 75 30 = 30000

00 00 EA 60

绿y坐标,00 00 EA 60 = 60000

00 00 3A 98

蓝x坐标,00 00 3A 98 = 15000

00 00 17 6F

蓝x坐标,00 00 17 6F  = 5999

92 5F C5 46

CRC值

继续分析下面的数据,按照前面的分析方法,分析出接下来的数据块是调色板数据块(PLTE),因为pic1.png是256色图像,所以应该有256个调色板项,每个调色板项占3字节。

调色板数据块(PLTE)的结构可以用以下代码定义:

typedef struct {
BYTE btRed;
BYTE btGreen;
BYTE btBlue;
} PNG_PALETTE_PIXEL;
PNG_CHUNK_HEADER chunkHdr;
PNG_PALETTE_PIXEL plteChunkData[chunkHdr.btChunkLen/3];
DWORD plteCrc;

 

 

-----------------------------------------------------------------

5.2.3  分析PNG图像文件结构(5)

-----------------------------------------------------------------

 

图5-24所示为pic1.png中的调色板数据块(PLTE)的数据结构。

498)this.style.width=498;" border=0> (点击查看大图)图5-24  pic1.png图像文件中调色板数据块(PLTE)结构498)this.style.width=498;" border=0> (点击查看大图)图5-24  pic1.png图像文件中调色板数据块(PLTE)结构

表5-21 所示为pic1.png图像文件中的调色板数据块(PLTE)各字段的含义。

表5-21 pic1.png图像文件中调色板数据块(PLTE)各字段的含义


十六进制值

描    述

00 00 03 00

PLTE数据块的长度,00 00 03 00 = 768

50 4C 54 45

数据块类型标志,50 4C 54 45的ASCII值等于PLTE

00 00 00

调色板第1个索引

FF FF FF

调色板第2个索引

EA FF FF

调色板第3个索引

…………

调色板第…个索引

E4 DC DC

调色板第255个索引

FF FF FF

调色板第256个索引

7D 2C 3D AD

CRC值

继续分析下面的数据,按照前面的分析方法,分析出接下来的数据块是图像透明数据块(tRNS),对于256色图像来说,图像透明数据块(tRNS)一共有256项,每项对应调色板数据块中的一项,00代表透明,FF代表不透明。

图像透明数据块(tRNS)的结构可以用以下代码定义:

PNG_CHUNK_HEADER chunkHdr;
BYTE trnsChunkData[chunkHdr.btChunkLen]
DWORD trnsCrc;
图5-25所示为pic1.png中的图像透明数据块(tRNS)的数据结构。
498)this.style.width=498;" border=0> (点击查看大图)图5-25  pic1.png图像文件中图像透明数据块(tRNS)的结构

表5-22所示为pic1.png图像文件中的图像透明数据块(tRNS)各字段的含义。

表5-22 pic1.png图像文件中图像透明数据块(tRNS)各字段的含义


十六进制值

描    述

00 00 01 00

tRNS数据块的长度,00 00 01 00 = 256

74 52 4E 53

数据块类型标志,74 52 4E 53的ASCII值等于tRNS

FF~00

图像透明数据块,一共256个,每个对应调色
板中的一项,00代表透明,FF代表不透明

53 F7 07 25

CRC值

继续分析下面的数据,按照前面的分析方法,分析出接下来的数据块是图像数据块(IDAT)。对于256色图像来说,图像数据块(IDAT)存放的是指向调色板的索引序号,对于16位色以上图像,图像数据块(IDAT)存放的是实际像素颜色,按0xRRGGBB排列。需要注意的是,图像数据块(IDAT)中的数据是经过变种的LZ77压缩过的。

图像数据块(IDAT)的结构可以用以下代码定义:

PNG_CHUNK_HEADER chunkHdr;
BYTE idatChunkData[chunkHdr.btChunkLen];
DWORD idatCrc;
     --------------------------------------------------------------

5.2.3  分析PNG图像文件结构(6)

-------------------------------------------------------------

图5-26所示为pic1.png中的图像数据块(IDAT)的数据结构。

498)this.style.width=498;" border=0> (点击查看大图)图5-26  pic1.png中的图像数据块(IDAT)的数据结构498)this.style.width=498;" border=0> (点击查看大图)图5-26  pic1.png中的图像数据块(IDAT)的数据结构

表5-23所示为pic1.png图像文件中的图像数据块(IDAT)各字段的含义。

表5-23 pic1.png图像文件中图像数据块(IDAT)各字段的含义


十六进制值

描    述

00 00 3D 53

IDAT数据块的长度,00 00 3D 53 = 15699

49 44 41 54

数据块类型标志,49 44 41 54的ASCII值等于IDAT

78~67

图像数据块,一共15699字节,使用变种的LZ77压缩过

0E EE 51 34

CRC值

继续分析下面的数据,按照前面的分析方法,分析出接下来的数据块是图像结束数据(IEND),一般情况下所有PNG图像的图像结束数据(IEND)是一样的,除非自行修改。

图像结束数据(IEND)的结构可以用以下代码定义:

PNG_CHUNK_HEADER chunkHdr;
DWORD idatCrc;
图5-27所示为pic1.png中的图像结束数据(IEND)的数据结构。
498)this.style.width=498;" border=0> (点击查看大图)图5-27  pic1.png中的图像结束数据(IEND)的数据结构

表5-24所示为pic1.png图像文件中的图像结束数据(IEND)各字段的含义。

表5-24 pic1.png图像文件中图像结束数据(IEND)各字段的含义


十六进制值

描    述

00 00 00 00

IEND数据块的长度,00 00 00 00 = 0

49 45 4E 44

数据块类型标志,49 45 4E 44的ASCII值等于IEND

AE 42 60 82

CRC值

pic1.png文件格式已经分析完毕,pic2.png的文件格式可以参考上面pic1.png的分析,表5-25显示了pic1.png和pic2.png的文件结构区别。

表5-25 pic1.png和pic2.png的文件结构区别


pic1.png文件结构

pic2.png文件结构

IHDR

IHDR

pHYs

pHYs

iCCP

iCCP

gAMA

gAMA

cHRM

cHRM

PLTE

×

tRNS

×

IDAT

IDAT

IEND

IEND

从表5-24可以看出pic2.png没有PLTE和tRNS数据块,因为pic2.png是16位色图像不需要使用调色板。

PNG图像文件存储的数据块比较多,一般情况每个PNG图像文件的iCCP、gAMA和cHRM数据块中的数据是一样的,只有IHDR和pHYs两个数据块中某些字段数据不同,如图5-28所示。
498)this.style.width=498;" border=0> (点击查看大图)图5-28  两张不同的PNG格式图像的区别498)this.style.width=498;" border=0> (点击查看大图)图5-28  两张不同的PNG格式图像的区别

所以很多时候游戏编程人员为了节省游戏资源占用的硬盘空间,去掉了PNG图像文件的某些数据块。如果游戏的资源打包文件包含了PNG图像文件,但去掉了PNG某些数据块,这样对分析游戏资源包文件格式带来了一定的困难,但幸好PNG图像文件的某些数据块还是要保留的,例如图像数据块(IDAT),通过识别某些数据块的标识字符串还是比较容易识别出PNG格式的。

 

 

原创粉丝点击