png图片的文件存储格式
2010-11-28 13:19
295 查看
图形图像的位图格式—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文件格式的下列特性:
使用彩色查找表或者叫做调色板可支持256种颜色的彩色图像。
流式读/写性能(streamability):图像文件格式允许连续读出和写入图像数据,这个特性很适合于在通信过程中生成和显示图像。
逐次逼近显示(progressive display):这种特性可使在通信链路上传输图像文件的同时就在终端上显示图像,把整个轮廓显示出来之后逐步显示图像的细节,也就是先用低分辨率显示图像,然后逐步提高它的分辨率。
透明性(transparency):这个性能可使图像中某些部分不显示出来,用来创建一些有特色的图像。
辅助信息(ancillary information):这个特性可用来在图像文件中存储一些文本注释信息。
独立于计算机软硬件环境。
使用无损压缩。
PNG文件格式中要增加下列GIF文件格式所没有的特性:
每个像素为48位的真彩色图像。
每个像素为16位的灰度图像。
可为灰度图和真彩色图添加α通道。
添加图像的γ信息。
使用循环冗余码(cyclic redundancy code,CRC)检测损害的文件。
加快图像显示的逐次逼近显示方式。
标准的读/写工具包。
可在一个文件中存储多幅图像。
文件结构
PNG图像格式文件(或者称为数据流)由一个8字节的PNG文件署名(PNG file signature)域和按照特定结构组织的3个以上的数据块(chunk)组成。
PNG定义了两种类型的数据块,一种是称为关键数据块(critical chunk),这是标准的数据块,另一种叫做辅助数据块(ancillary chunks),这是可选的数据块。关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们,PNG读写软件也都必须要支持这些数据块。虽然PNG文件规范没有要求PNG编译码器对可选数据块进行编码和译码,但规范提倡支持可选数据块。
(1) PNG文件署名域
8字节的PNG文件署名域用来识别该文件是不是PNG文件。该域的值是:
十进制数 | 137 | 80 | 78 | 71 | 13 | 10 | 26 | 10 |
十六进制数 | 89 | 50 | 4e | 47 | 0d | 0a | 1a | 0a |
(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文件头键数据块的结构
域的名称 | 字节数 | 说明 |
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 遍隔行扫描方法) |
(2) 调色板数据块PLTE(palette chunk):它包含有与索引彩色图像((indexed-color image))相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前。真彩色的PNG数据流也可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。调色板数据块结构如表6-09所示。
表6-09 调色板数据块结构
域的名称 | 字节数 | 说明 |
Red | 1 byte | 0 = 黑,255 = 红 |
Green | "> 0 = 黑,255 = 绿 | |
Blue | 1 byte | 0 = 黑,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图像 |
498)this.style.width=498;" border=0> |
(点击查看大图)图5-17 在Winhex中打开pic1.png文件 |
498)this.style.width=498;" border=0> |
(点击查看大图)图5-18 PNG文件的文件标志 |
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 |
/*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 = 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 ) & 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); } |
表5-16所示为物理像素尺寸数据块(pHYs)中各字段的含义。
表5-16 物理像素尺寸数据块(pHYs) 中各字段的含义
字 段 名 | 大小(单 位:字节) | 描 述 |
physPixelPerUnitX | 4 | 每单位多少像素,x轴 |
physPixelPerUnitY | 4 | 每单位多少像素,y轴 |
UnkownUnit ,Meter | 1 | 枚举类型,UnkownUnit=0,表示只定义了像素显示的比例,未定义实际像素大小。 枚举类型,Meter=1,表示定义单位为米 |
PNG_CHUNK_HEADER chunkHdr ; uint physPixelPerUnitX; uint physPixelPerUnitY; enum { UnkownUnit = 0, Meter = 1 } pHYs; DWORD pHYsCrc; |
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数据块的结构可以用以下代码定义:
PNG_CHUNK_HEADER chunkHdr typedef struct { string profile_name; unsigned byte red; } PNG_ICCP_CHUNK_DATA; DWORD ICCPCrc; |
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数据块各字段的含义
十六进制值 | 描 述 |
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数据块的结构可以用以下代码定义:
PNG_CHUNK_HEADER chunkHdr; BYTE gamaChunkData[chunkHdr.btChunkLen]; DWORD gamaCrc; |
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数据块的结构可以用以下代码定义:
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; |
498)this.style.width=498;" border=0> |
(点击查看大图)图5-23 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)的结构可以用以下代码定义:
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)各字段的含义
十六进制值 | 描 述 |
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)的结构可以用以下代码定义:
PNG_CHUNK_HEADER chunkHdr; BYTE trnsChunkData[chunkHdr.btChunkLen] DWORD trnsCrc; |
498)this.style.width=498;" border=0> |
(点击查看大图)图5-25 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)的结构可以用以下代码定义:
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)各字段的含义
十六进制值 | 描 述 |
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_CHUNK_HEADER chunkHdr; DWORD idatCrc; |
498)this.style.width=498;" border=0> |
(点击查看大图)图5-27 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值 |
表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 |
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图片的文件存储格式
- c#判断图形文件(GIF,JPG,PNG)的图片格式的方法
- Nodejs把接收图片base64格式保存为文件存储到服务器上
- springboot搭建文件预览解决方案,支持目前主流格式office文件,txt文件,png,jpg等图片以及压缩文件的在线预览功能
- PNG文件结构分析(上:了解PNG文件存储格式)
- PNG文件结构(PNG图片格式)详解 .
- windows环境下emacs对jpg、gif、png等图片格式的支持文件
- PNG文件结构(PNG图片格式)详解
- PNG文件结构分析(上:了解PNG文件存储格式)
- PNG文件结构分析(上:了解PNG文件存储格式)
- Google图片存储格式WebP增加与PNG类似背景透明效果
- C# 判断图形文件(GIF,JPG,PNG)的图片格式的方法
- JPEG文件格式 存储格式 图片文件储存格式 JPEG文件详解
- C# 判断图形文件(GIF,JPG,PNG)的图片格式的方法
- PNG文件结构分析(上:了解PNG文件存储格式)
- PNG文件结构分析之一(了解PNG文件存储格式)
- PNG文件结构(PNG图片格式)详解
- 【转】PNG文件结构分析(上:了解PNG文件存储格式)