1、第一个数据块调色板数据块(PLTE)第二个数据块,可选图像数据块(IDAT)允许如果有调色板数据块(PLTE),则是第三个数据块,如果没有调色板数据块(PLTE),则时第二个数据块。如果有多个图像数据块,则必须按图像数据连续存储图像结束数据(IEND)最后一个数据块表5-10 PNG文件的辅助数据块(ancillary chunks)组织顺序允许多个数据块基色和白色点数据块(cHRM)在PLTE和IDAT之前图像数据块(gAMA)ICCP(iCCP)在PLTE之后IDAT之前如果有iCCP,则无sRGB续表样本有效位数据块(sBIT)标准RPG颜色(sRGB)在PLTE之后IDAT之前如果有s
2、RGB,则无iCCP背景颜色数据块(bKGD)在PLTE之后IDAT之前图像直方图数据块(hIST)图像透明数据块(tRNS)物理像素尺寸数据块(pHYs)在IDAT之前建议调色板(sPLT)图像最后修改时间数据块(tIME)无限制国际文本数据(iTXt)文本信息数据块(tEXt)压缩文本数据块(zTXt)PNG图像文件存储结构(2)用图像可以清晰显示表5-9和表5-10之间的关系,如图5-13和图5-14所示。 (点击查看大图)图5-13 包含调色板数据块(PLTE)的PNG图像文件格式(点击查看大图)图5-14 不包含调色板数据块(PLTE)的PNG图像文件格式图中上标的含义如表5-11所
3、示。表5-11 上标的含义符 号含 义1只有1个+1个或多个?0个或1个*0个或多个|2选1PNG图像文件中每一块数据块的格式都是相同的,分别由4个部分组成,格式如表5-12所示。表5-12 PNG文件的数据块格式字 段 名大小(单位:字节)描 述Length(长度)4指定数据块中的数据长度 Chunk Type Code(数据块类型码)数据块类型,例如IHDR、PLTE、IDAT等Chunk Data(数据块数据)Length存储数据CRC(循环冗余检测)循环冗余码CRC循环冗余码生成的计算方式是通过对Chunk Type Code和Chunk Data中的数据进行计算得到的,计算方式如下:
4、x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1PNG图像文件存储结构(3)下面将讲解在PNG文件中的4个关键数据块(critical chunk)的含义。 文件头数据块(IHDR)文件头数据块(IHDR)它包含有PNG文件中存储的图像数据的基本信息,如图像的宽高、色深、颜色类型、压缩方式等。一个PNG文件只能有一个文件头数据块,表5-13列出了文件头数据块(IHDR)中各字段的含义。表5-13 文件头数据块(IHDR) 中各字段的含义字段名Width图像宽度,以像素为单位Height图像高度,以像素为单位Bit depth图像深度:索引彩色
5、图像:1,2,4或8灰度图像:1,2,4,8或16真彩色图像:8或16ColorType颜色类型:0:灰度图像,1,2,4,8或162:真彩色图像,8或163:索引彩色图像,1,2,4或84:带通道数据的灰度图像,8或166:带通道数据的真彩色图像,8或16Compression method压缩方法(LZ77变种算法)Filter method滤波器方法Interlace隔行扫描方法:非隔行扫描 1: Adam7(由Adam M. Costello开发的7遍隔行扫描方法)文件头数据块(IHDR)结构可以使用如下代码定义:typedef struct DWORD btChunkLen;CHAR
6、 btChunkType4; PNG_CHUNK_HEADER;typedef enum pngColorSpaceType GrayScale = 0,TrueColor = 2,Indexed = 3,AlphaGrayScale = 4,AlphaTrueColor = 6 PNG_COLOR_SPACE_TYPE;/ Compression Methodstypedef enum pngCompressionMethod Deflate = 0 PNG_COMPR_METHOD;/ Filter Methodstypedef enum pngFilterMethod AdaptiveF
7、iltering = 0 PNG_FILTER_METHOD;/ Interlace Methodstypedef enum pngInterlaceMethod NoInterlace = 0,Adam7Interlace = 1 PNG_INTERLACE_METHOD;/ IHDR dataUINT width;UINT height;BYTE bit_depth;PNG_COLOR_SPACE_TYPE color_type;PNG_COMPR_METHOD compr_method;PNG_FILTER_METHOD filter_method;PNG_INTERLACE_METHO
8、D interlace_method; IHDR_CHUNK_DATA; 调色板数据块(PLTE)PNG的调色板数据块(PLTE)和之前介绍BMP图像格式中的调色板类似,都是提供给8位色深以下的图像使用。PNG的调色板由3个字节组成,每个字节分别表示红、绿、蓝三色的颜色值。对于PNG图像文件来说,大于8位色深的图像,如真彩色图像也可以使用调色板,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。一个PNG文件只能有一个调色板数据块,调色板数据块从下标0开始,表5-14列出了调色板数据块(PLTE)中各字段的含义。表5-14 调色板数据块(PLTE) 中各字段的含义btRed红色颜色
9、值btGreen绿色颜色值btBlue蓝色颜色值调色板数据块(PLTE)结构可以使用如下代码定义:BYTE btRed ;BYTE btGreen;BYTE btBlue; PNG_PALETTE_PIXEL;PNG图像文件存储结构(4) 图像数据块(IDAT)PNG的图像数据块(IDAT)存储图像的实际数据,相当于BMP图像的图像数据,由于PNG可包含多幅图像,所以PNG的图像数据块可能是由一幅图像的数据组成,也可能是由多幅图像的数据组成。图像数据块中的图像数据可能是经过变种的LZ77压缩编码DEFLATE压缩的,关于DEFLATE详细介绍可以参考DEFLATE Compressed Dat
10、a Format Specification version 1.3,网址: http:/www.ietf.org/rfc/rfc1951.txt 。图像数据块(IDAT)结构可以使用如下代码定义:PNG_CHUNK_HEADER chunkHdr;BYTE idatChunkDatachunkHdr.btChunkLen;DWORD idatCrc ; 图像结束数据(IEND)PNG的图像结束数据(IEND)用来标记PNG文件结束,并且必须要放在文件的尾部。一般情况下,所有PNG图像结束数据(IEND)的十六进制数值都是一样的,具体的数值如下:00 00 00 00 49 45 4E 44
11、AE 42 60 82PNG的辅助数据块(ancillary chunks)一共有14个,可以分为5类,如表5-10所示,由于篇幅关系不能将全部辅助数据块(ancillary chunks)的详细结构进行说明,如果读者有兴趣请参考 http:/www.w3.org/TR/REC-png.html。分析PNG图像文件结构(1)结合上面对PNG文件的分析,下面分别对256色和16位色的PNG图像进行十六进制分析,通过分析PNG文件让读者更深入了解PNG文件格式。如图5-15和图5-16所示,分别为256色PNG图像pic1.png和16位色PNG图像pic2.png。其中pic1.png图像的分辨
12、 率为200150,文件大小为19 534 字节。pic2.png图像的分辨率为200150,文件大小为104 744字节,带透明通道。图5-15 pic1.png图像图5-16 pic2.png图像现在来分析pic1.png的图像文件,在Winhex中打开pic1.png,如图5-17所示。(点击查看大图)图5-17 在Winhex中打开pic1.png文件首先分析PNG的文件标志。根据PNG文件的定义,从文件头开始前8字节数据是PNG文件的标志,如图5-18所示。(点击查看大图)图5-18 PNG文件的文件标志接下来应该就是PNG文件的数据块结构了,按照前面对PNG文件结构的分析,第一个数
13、据块应该是文件头数据块(IHDR)数据块,文件头数据块(IHDR)定义了PNG文件的宽高、色深、压缩方法等参数,如图5-19所示。(点击查看大图)图5-19 文件头数据块(IHDR)结构分析PNG图像文件结构(2)表5-15归纳了pic1.png图像文件中文件头数据块(IHDR)中各字段的含义。由于PNG文件使用Big-Endian顺序存储数据,所以不需要反转字节数据理解。表5-15 pic1.png图像文件中文件头数据块(IHDR)的各字段含义十六进制值00 00 00 0D文件头的数据长度,00 00 00 0D =1349 48 44 52数据块类型标志,49 48 44 52的ASCI
14、I值等于IHDR00 00 00 C8图像的宽度,00 00 00 C8 = 20000 00 00 96图像的高度,00 00 00 96 = 15008色深,表示2的8次幂等于256色0303表示索引图像0000表示使用Deflate压缩编码压缩图像数据00表示为将来使用更好的压缩方法预留00表示非隔行扫描AC 02 37 2BAC 02 37 2B表示CRC从表5-14看到pic1.png文件的文件头数据块(IHDR)结构中的CRC字段的值为AC 02 37 2B,这个CRC值是按照从数据块类型标志字段到CRC字段前一字节的数据计算而来的,即使用数据49 48 44 52 00 00 0
15、0 C8 00 00 00 96 08 03 00 00 00计算,CRC的计算代码如下: /*8位消息的CRC表格*/unsigned long crc_table256;/*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 1);elsec = c 1;crc_tablen = c;crc_ta
16、ble_computed = 1;/*使用bu0.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(); len;c = crc_table(c bufn) & 0xff (c 8);return c;/* 返回 CRC表格buf0.len-1. */unsigned long crc(unsigned char *buf, int len)r
17、eturn update_crc(0xffffffffL, buf, len) 0xffffffffL;main()/*计算CRC需要的初始化数据,不同的数据块有不同的初始化数据*/unsigned char buf17 = 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图像文件中数据块的数据结构分析,接下来的数
18、据块是物理像素尺寸数据块(pHYs),物理像素尺寸数据块(pHYs)指定像素大小或图像的宽和高的比例。表5-16所示为物理像素尺寸数据块(pHYs)中各字段的含义。表5-16 物理像素尺寸数据块(pHYs) 中各字段的含义physPixelPerUnitX每单位多少像素,x轴physPixelPerUnitY每单位多少像素,y轴UnkownUnit,Meter枚举类型,UnkownUnit=0,表示只定义了像素显示的比例,未定义实际像素大小。枚举类型,Meter=1,表示定义单位为米物理像素尺寸数据块(pHYs)的结构可以用以下代码定义:PNG_CHUNK_HEADER chunkHdr ;u
19、int physPixelPerUnitX;uint physPixelPerUnitY;enum UnkownUnit = 0,Meter = 1 pHYs;DWORD pHYsCrc;图5-20所示为pic1.png中的物理像素尺寸数据块(pHYs)的结构。(点击查看大图)图5-20 pic1.png中的物理像素尺寸数据块(pHYs)的结构分析PNG图像文件结构(3)表5-17所示为pic1.png图像文件中物理像素尺寸数据块(pHYs)中各字段的含义。表5-17 pic1.png图像文件中物理像素尺寸数据块(pHYs)中各字段的含义00 00 00 09物理像素尺寸数据块的长度,00 0
20、0 00 09 =970 48 59 73数据块类型标志,70 48 59 73的ASCII值等于pHYs00 00 0B 13x轴上每米像素的数量,00 00 0B 13 = 2835,即每米2835个像素y轴上每米像素的数量,00 00 0B 13 = 2835,即每米2835个像素01Meter=1,将单位定义为米00 9A 9C 18CRC值继续分析下面的数据,按照前面的分析方法,分析出接下来的数据块是iCCP,iCCP数据块是PNG解码时进行特殊的颜色处理信息。iCCP数据块的结构可以用以下代码定义:PNG_CHUNK_HEADER chunkHdrstring profile_na
21、me;unsigned byte red; PNG_ICCP_CHUNK_DATA;DWORD ICCPCrc;图5-21所示为pic1.png中的iCCP的数据结构。(点击查看大图)图5-21 pic1.png图像文件中iCCP数据块结构表5-18所示为pic1.png图像文件中的iCCP数据块各字段的含义。表5-18 pic1.png图像文件中的iCCP数据块各字段的含义00 00 0A 4DICCP数据块的长度,00 00 0A 4D = 263769 43 43 50数据块类型标志,69 43 43 50的ASCII值等于iCCP50 68 6F 74 6F 73 68 6F 70 2
22、0 49 43 43 20 70 72 6F 66 69 6C 65 00配置文件名,长度179字节,以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压缩方法,0表示使用deflate压缩78 DA 9D 53F7 84 F3 FB压缩后的配置文件,解码时使用继续分析下面的数据,按照前面的分析方法,分析出接下来的数据块是gAMA,gAMA数据块是PNG解码时进行gamma校正的信息。gAMA数据块的结构可以用以下代码定义:BYTE
23、 gamaChunkDatachunkHdr.btChunkLen;DWORD gamaCrc;图5-22所示为pic1.png中的gAMA的数据结构:(点击查看大图)图5-22 pic1.png图像文件中gAMA数据块结构分析PNG图像文件结构(4)表5-19所示为pic1.png图像文件中的gAMA数据块各字段的含义。表5-19 pic1.png图像文件中的gAMA数据块各字段的含义00 00 00 04gAMA数据块的长度,00 00 00 04 = 467 41 4D 41数据块类型标志,67 41 4D 41的ASCII值等于gAMA00 00 B1 8Egamma校正信息7C F8 51 93继续分析下面的数据,按照前面的分析方法,分析出接下来的数据块是cHRM,cHRM是在设备不能够显示正确的颜色时,使图像尽可能校正颜色的信息,也叫做设备无关的颜色信息。cHRM数据块的结构可以用以下代码定义:uint x;uint y; PNG_POINT;PNG_POINT white;PNG_POINT red;PNG_POINT green;PNG_POINT blue; PNG_CHRM_CHUNK_DATA;PNG_CHRM_CHUNK_DATA chrmChunkData;DWORD chrmCrc;图5-23所示为pic1.png中的cHRM的数据结构。(
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1