




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 PNG图像文件介绍PNG图像文件格式PNG是可携式网络图像(portable network graphics)的英文缩写。PNG是从网络上开始发展的,目的是替代GIF和JPG格式,PNG图像文件格式也是当今游戏中常用的图像资源文件格式 了。PNG图像文件支持的图像颜色非常丰富,存储灰度图时可使用16位色深表示,存储真彩色图像时色深更可达到48位之多。PNG图像文件介绍与BMP格式相比,PNG格式稍微复杂些。PNG图像支持从0255级次的多层透明色,使用无损压缩的zlib压缩算法压缩图像数据。通常使用 zlib压缩过的图像文件大小比BMP使用的RLE压缩的效果好,BMP的RLE压缩算法只支持
2、压缩8位以下的图像,对于16位以上的真彩色图像不支持图 像压缩,PNG使用的zlib压缩算法支持任何色深的图像数据压缩,压缩后的图像数据可以完整还原,相比之下JPG需要牺牲图像质量使用有损压缩来获得大 的压缩率。最后有一点需要注意,PNG图像格式使用Big-Endian顺序存储数据。PNG图像文件存储结构(1)PNG文件存储结构的格式可以在上找到定义。BMP文件总体上由两部分组成,分别是PNG文件标志和数据块(chunks),如表5-8所示。其中数据块分为两类:关键数据块(critical chunk)和辅助数据块(ancillary chunks)。表5-8 PNG文件的组成结构PNG文件标
3、志数据块(chunks)1PNG文件标志PNG文件标志由8字节数据组成:89 50 4E 47 0D 0A 1A 0Ah,其中50 4E 47对应的ASCII值是PNG。2数据块(chunks)紧跟在PNG文件标志后面的数据是数据块(chunks),数据块(chunks)分为两类:关键数据块(critical chunks)和辅助数据块(ancillary chunks)。关键数据块(critical chunk)在PNG文件中是必须有的,而辅助数据块(ancillary chunks)是可选的。关键数据块(critical chunks)由4部分组成:文件头数据块(IHDR)、调色板数据块(
4、PLTE)、图像数据块(IDAT)和图像结束数据(IEND),其中调色板数据块(PLTE)根据图像的色深可选。辅助数据块(ancillary chunks)一共有14个,这些辅助数据块包含了很多信息,辅助数据块不是必须包含的。PNG文件的关键数据块和辅助数据块的组织顺序如表5-9和表5-10所示。表5-9 PNG文件的关键数据块(critical chunks)组织顺序数据块名称允许多个数据块位 置文件头数据块(IHDR)不允许第一个数据块调色板数据块(PLTE)不允许第二个数据块,可选图像数据块(IDAT)允许如果有调色板数据块(PLTE),则是第三个数据块,如果没有调色板数据块(PLTE)
5、,则时第二个数据块。如果有多个图像数据块,则必须按图像数据连续存储图像结束数据(IEND)不允许最后一个数据块表5-10 PNG文件的辅助数据块(ancillary chunks)组织顺序数据块名称允许多个数据块位 置基色和白色点数据块(cHRM)不允许在PLTE和IDAT之前图像数据块(gAMA)不允许在PLTE和IDAT之前ICCP(iCCP)允许在PLTE之后IDAT之前如果有iCCP,则无sRGB续表数据块名称允许多个数据块位 置样本有效位数据块(sBIT)不允许在PLTE和IDAT之前标准RPG颜色(sRGB)不允许在PLTE之后IDAT之前如果有sRGB,则无iCCP背景颜色数据块
6、(bKGD)不允许在PLTE之后IDAT之前图像直方图数据块(hIST)不允许在PLTE之后IDAT之前图像透明数据块(tRNS)不允许在PLTE之后IDAT之前物理像素尺寸数据块(pHYs)不允许在IDAT之前建议调色板(sPLT)允许在IDAT之前图像最后修改时间数据块(tIME)不允许无限制国际文本数据(iTXt)允许无限制文本信息数据块(tEXt)允许无限制压缩文本数据块(zTXt)允许无限制PNG图像文件存储结构(2)用图像可以清晰显示表5-9和表5-10之间的关系,如图5-13和图5-14所示。 (点击查看大图)图5-13 包含调色板数据块(PLTE)的PNG图像文件格式 (点击查
7、看大图)图5-14 不包含调色板数据块(PLTE)的PNG图像文件格式图中上标的含义如表5-11所示。表5-11 上标的含义符 号含 义1只有1个+1个或多个?0个或1个*0个或多个|2选1PNG图像文件中每一块数据块的格式都是相同的,分别由4个部分组成,格式如表5-12所示。表5-12 PNG文件的数据块格式字 段 名大小(单位:字节)描 述Length(长度)4指定数据块中的数据长度 Chunk Type Code(数据块类型码)4数据块类型,例如IHDR、PLTE、IDAT等Chunk Data(数据块数据)Length存储数据CRC(循环冗余检测)4循环冗余码CRC循环冗余码生成的计算
8、方式是通过对Chunk Type Code和Chunk Data中的数据进行计算得到的,计算方式如下: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) 中各字段的含义字段名
9、大小(单位:字节)描 述Width4图像宽度,以像素为单位Height4图像高度,以像素为单位Bit depth1图像深度: 索引彩色图像:1,2,4或8灰度图像:1,2,4,8或16真彩色图像:8或16ColorType1颜色类型:0:灰度图像,1,2,4,8或162:真彩色图像,8或163:索引彩色图像,1,2,4或84:带通道数据的灰度图像,8或166:带通道数据的真彩色图像,8或16Compression method1压缩方法(LZ77变种算法)Filter method1滤波器方法Interlace method1隔行扫描方法:0:非隔行扫描 1: Adam7(由Adam M. C
10、ostello开发的7遍隔行扫描方法)文件头数据块(IHDR)结构可以使用如下代码定义:typedef struct DWORD btChunkLen;CHAR 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 Def
11、late = 0 PNG_COMPR_METHOD;/ Filter Methodstypedef enum pngFilterMethod AdaptiveFiltering = 0 PNG_FILTER_METHOD;/ Interlace Methodstypedef enum pngInterlaceMethod NoInterlace = 0,Adam7Interlace = 1 PNG_INTERLACE_METHOD;/ IHDR datatypedef struct UINT width;UINT height;BYTE bit_depth;PNG_COLOR_SPACE_TY
12、PE color_type;PNG_COMPR_METHOD compr_method;PNG_FILTER_METHOD filter_method;PNG_INTERLACE_METHOD interlace_method; IHDR_CHUNK_DATA; 调色板数据块(PLTE)PNG的调色板数据块(PLTE)和之前介绍BMP图像格式中的调色板类似,都是提供给8位色深以下的图像使用。PNG的调色板由3个字节组成,每个字节分别表示红、绿、蓝三色的颜色值。对于PNG图像文件来说,大于8位色深的图像,如真彩色图像也可以使用调色板,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。
13、一个PNG文件只能有一个调色板数据块,调色板数据块从下标0开始,表5-14列出了调色板数据块(PLTE)中各字段的含义。表5-14 调色板数据块(PLTE) 中各字段的含义字段名大小(单位:字节)描 述btRed1红色颜色值btGreen1绿色颜色值btBlue1蓝色颜色值调色板数据块(PLTE)结构可以使用如下代码定义:typedef struct BYTE btRed ;BYTE btGreen;BYTE btBlue; PNG_PALETTE_PIXEL;PNG图像文件存储结构(4) 图像数据块(IDAT)PNG的图像数据块(IDAT)存储图像的实际数据,相当于BMP图像的图像数据,由于
14、PNG可包含多幅图像,所以PNG的图像数据块可能是由一幅图像的数据组成,也可能是由多幅图像的数据组成。图像数据块中的图像数据可能是经过变种的LZ77压缩编码DEFLATE压缩的,关于DEFLATE详细介绍可以参考DEFLATE Compressed Data Format Specification version 1.3,网址: 。图像数据块(IDAT)结构可以使用如下代码定义:PNG_CHUNK_HEADER chunkHdr;BYTE idatChunkDatachunkHdr.btChunkLen;DWORD idatCrc ; 图像结束数据(IEND)PNG的图像结束数据(IEND)
15、用来标记PNG文件结束,并且必须要放在文件的尾部。一般情况下,所有PNG图像结束数据(IEND)的十六进制数值都是一样的,具体的数值如下:00 00 00 00 49 45 4E 44 AE 42 60 82PNG的辅助数据块(ancillary chunks)一共有14个,可以分为5类,如表5-10所示,由于篇幅关系不能将全部辅助数据块(ancillary chunks)的详细结构进行说明,如果读者有兴趣请参考 。分析PNG图像文件结构(1)结合上面对PNG文件的分析,下面分别对256色和16位色的PNG图像进行十六进制分析,通过分析PNG文件让读者更深入了解PNG文件格式。如图5-15和图
16、5-16所示,分别为256色PNG图像pic1.png和16位色PNG图像pic2.png。其中pic1.png图像的分辨 率为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所示。
17、(点击查看大图)图5-18 PNG文件的文件标志接下来应该就是PNG文件的数据块结构了,按照前面对PNG文件结构的分析,第一个数据块应该是文件头数据块(IHDR)数据块,文件头数据块(IHDR)定义了PNG文件的宽高、色深、压缩方法等参数,如图5-19所示。 (点击查看大图)图5-19 文件头数据块(IHDR)结构分析PNG图像文件结构(2)表5-15归纳了pic1.png图像文件中文件头数据块(IHDR)中各字段的含义。由于PNG文件使用Big-Endian顺序存储数据,所以不需要反转字节数据理解。表5-15 pic1.png图像文件中文件头数据块(IHDR)的各字段含义十六进制值描 述00
18、 00 00 0D文件头的数据长度,00 00 00 0D =1349 48 44 52数据块类型标志,49 48 44 52的ASCII值等于IHDR00 00 00 C8图像的宽度,00 00 00 C8 = 20000 00 00 96图像的高度,00 00 00 96 = 15008色深,表示2的8次幂等于256色0303表示索引图像0000表示使用Deflate压缩编码压缩图像数据0000表示为将来使用更好的压缩方法预留0000表示非隔行扫描AC 02 37 2BAC 02 37 2B表示CRC从表5-14看到pic1.png文件的文件头数据块(IHDR)结构中的CRC字段的值为AC
19、 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_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+)
20、c = (unsigned long) n;for (k = 0; k 1);elsec = c 1;crc_tablen = c;crc_table_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();for (n = 0; n 8);return c;/* 返回 CRC表格buf0.len-1.
21、*/unsigned long crc(unsigned char *buf, int len)return update_crc(0 xffffffffL, buf, len) 0 xffffffffL;main()/*计算CRC需要的初始化数据,不同的数据块有不同的初始化数据*/unsigned char buf17 = 0 x49,0 x48,0 x44,0 x52,0 x00,0 x00,0 x00,0 xC8,0 x00,0 x00,0 x00,0 x96,0 x08,0 x03,0 x00,0 x00,0 x00;unsigned long value=0;value= crc(b
22、uf,17);继续分析下面的数据块,PNG图像文件的数据块类型由数据块类型标志决定,按照PNG图像文件中数据块的数据结构分析,接下来的数据块是物理像素尺寸数据块(pHYs),物理像素尺寸数据块(pHYs)指定像素大小或图像的宽和高的比例。表5-16所示为物理像素尺寸数据块(pHYs)中各字段的含义。表5-16 物理像素尺寸数据块(pHYs) 中各字段的含义字 段 名大小(单位:字节)描 述physPixelPerUnitX4每单位多少像素,x轴physPixelPerUnitY4每单位多少像素,y轴UnkownUnit,Meter1枚举类型,UnkownUnit=0,表示只定义了像素显示的比例
23、,未定义实际像素大小。枚举类型,Meter=1,表示定义单位为米物理像素尺寸数据块(pHYs)的结构可以用以下代码定义:PNG_CHUNK_HEADER chunkHdr ;uint 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图像文件中物理像
24、素尺寸数据块(pHYs)中各字段的含义。表5-17 pic1.png图像文件中物理像素尺寸数据块(pHYs)中各字段的含义十六进制值描 述00 00 00 09物理像素尺寸数据块的长度,00 00 00 09 =970 48 59 73数据块类型标志,70 48 59 73的ASCII值等于pHYs00 00 0B 13x轴上每米像素的数量,00 00 0B 13 = 2835,即每米2835个像素00 00 0B 13y轴上每米像素的数量,00 00 0B 13 = 2835,即每米2835个像素01Meter=1,将单位定义为米00 9A 9C 18CRC值继续分析下面的数据,按照前面的分
25、析方法,分析出接下来的数据块是iCCP,iCCP数据块是PNG解码时进行特殊的颜色处理信息。iCCP数据块的结构可以用以下代码定义:PNG_CHUNK_HEADER chunkHdrtypedef struct string profile_name;unsigned byte red; PNG_ICCP_CHUNK_DATA;DWORD ICCPCrc; 图5-21所示为pic1.png中的iCCP的数据结构。 (点击查看大图)图5-21 pic1.png图像文件中iCCP数据块结构 (点击查看大图)图5-21 pic1.png图像文件中iCCP数据块结构表5-18所示为pic1.png图像
26、文件中的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 20 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的A
27、SCII值等于Photoshop ICC profile00压缩方法,0表示使用deflate压缩78 DA 9D 53F7 84 F3 FB压缩后的配置文件,解码时使用继续分析下面的数据,按照前面的分析方法,分析出接下来的数据块是gAMA,gAMA数据块是PNG解码时进行gamma校正的信息。gAMA数据块的结构可以用以下代码定义:PNG_CHUNK_HEADER chunkHdr;BYTE gamaChunkDatachunkHdr.btChunkLen;DWORD gamaCrc;图5-22所示为pic1.png中的gAMA的数据结构: (点击查看大图)图5-22 pic1.png图像文
28、件中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 93CRC值继续分析下面的数据,按照前面的分析方法,分析出接下来的数据块是cHRM,cHRM是在设备不能够显示正确的颜色时,使图像尽可能校正颜色的信息,也叫做设备无关的颜色信息。
29、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的数据结构。 (点击查看大图)图5-23 pic1.png图像文件中cHRM数据块结构表5-2
30、0所示为pic1.png图像文件中的cHRM数据块各字段的含义。表5-20 pic1.png图像文件中的cHRM数据块各字段的含义十六进制值描 述00 00 00 20cHRM数据块的长度,00 00 00 20 = 3263 48 52 4D数据块类型标志,63 48 52 4D的ASCII值等于cHRM00 00 7A 25白色点的x轴坐标,00 00 7A 25 = 31269续表十六进制值描 述00 00 80 83白色点的y轴坐标,00 00 80 83 = 3289900 00 F9 FF红x坐标,00 00 F9 FF = 6399900 00 80 E9红y坐标,00 00 8
31、0 E9 = 3300100 00 75 30绿x坐标,00 00 75 30 = 3000000 00 EA 60绿y坐标,00 00 EA 60 = 6000000 00 3A 98蓝x坐标,00 00 3A 98 = 1500000 00 17 6F蓝x坐标,00 00 17 6F = 599992 5F C5 46CRC值继续分析下面的数据,按照前面的分析方法,分析出接下来的数据块是调色板数据块(PLTE),因为pic1.png是256色图像,所以应该有256个调色板项,每个调色板项占3字节。调色板数据块(PLTE)的结构可以用以下代码定义:typedef struct BYTE bt
32、Red;BYTE btGreen;BYTE btBlue; PNG_PALETTE_PIXEL;PNG_CHUNK_HEADER chunkHdr;PNG_PALETTE_PIXEL plteChunkDatachunkHdr.btChunkLen/3;DWORD plteCrc;分析PNG图像文件结构(5)图5-24所示为pic1.png中的调色板数据块(PLTE)的数据结构。 (点击查看大图)图5-24 pic1.png图像文件中调色板数据块(PLTE)结构 (点击查看大图)图5-24 pic1.png图像文件中调色板数据块(PLTE)结构表5-21 所示为pic1.png图像文件中的调色
33、板数据块(PLTE)各字段的含义。表5-21 pic1.png图像文件中调色板数据块(PLTE)各字段的含义十六进制值描 述00 00 03 00PLTE数据块的长度,00 00 03 00 = 76850 4C 54 45数据块类型标志,50 4C 54 45的ASCII值等于PLTE00 00 00调色板第1个索引FF FF FF调色板第2个索引EA FF FF调色板第3个索引调色板第个索引E4 DC DC调色板第255个索引FF FF FF调色板第256个索引7D 2C 3D ADCRC值继续分析下面的数据,按照前面的分析方法,分析出接下来的数据块是图像透明数据块(tRNS),对于256
34、色图像来说,图像透明数据块(tRNS)一共有256项,每项对应调色板数据块中的一项,00代表透明,FF代表不透明。图像透明数据块(tRNS)的结构可以用以下代码定义:PNG_CHUNK_HEADER chunkHdr;BYTE trnsChunkDatachunkHdr.btChunkLenDWORD trnsCrc;图5-25所示为pic1.png中的图像透明数据块(tRNS)的数据结构。 (点击查看大图)图5-25 pic1.png图像文件中图像透明数据块(tRNS)的结构表5-22所示为pic1.png图像文件中的图像透明数据块(tRNS)各字段的含义。表5-22 pic1.png图像文
35、件中图像透明数据块(tRNS)各字段的含义十六进制值描 述00 00 01 00tRNS数据块的长度,00 00 01 00 = 25674 52 4E 53数据块类型标志,74 52 4E 53的ASCII值等于tRNSFF00图像透明数据块,一共256个,每个对应调色板中的一项,00代表透明,FF代表不透明53 F7 07 25CRC值继续分析下面的数据,按照前面的分析方法,分析出接下来的数据块是图像数据块(IDAT)。对于256色图像来说,图像数据块(IDAT)存放的是 指向调色板的索引序号,对于16位色以上图像,图像数据块(IDAT)存放的是实际像素颜色,按0 xRRGGBB排列。需要
36、注意的是,图像数据块 (IDAT)中的数据是经过变种的LZ77压缩过的。图像数据块(IDAT)的结构可以用以下代码定义:PNG_CHUNK_HEADER chunkHdr;BYTE idatChunkDatachunkHdr.btChunkLen;DWORD idatCrc;分析PNG图像文件结构(6)图5-26所示为pic1.png中的图像数据块(IDAT)的数据结构。 (点击查看大图)图5-26 pic1.png中的图像数据块(IDAT)的数据结构 (点击查看大图)图5-26 pic1.png中的图像数据块(IDAT)的数据结构表5-23所示为pic1.png图像文件中的图像数据块(IDA
37、T)各字段的含义。表5-23 pic1.png图像文件中图像数据块(IDAT)各字段的含义十六进制值描 述00 00 3D 53IDAT数据块的长度,00 00 3D 53 = 1569949 44 41 54数据块类型标志,49 44 41 54的ASCII值等于IDAT7867图像数据块,一共15699字节,使用变种的LZ77压缩过0E EE 51 34CRC值继续分析下面的数据,按照前面的分析方法,分析出接下来的数据块是图像结束数据(IEND),一般情况下所有PNG图像的图像结束数据(IEND)是一样的,除非自行修改。图像结束数据(IEND)的结构可以用以下代码定义:PNG_CHUNK_
38、HEADER chunkHdr;DWORD idatCrc;图5-27所示为pic1.png中的图像结束数据(IEND)的数据结构。 (点击查看大图)图5-27 pic1.png中的图像结束数据(IEND)的数据结构表5-24所示为pic1.png图像文件中的图像结束数据(IEND)各字段的含义。表5-24 pic1.png图像文件中图像结束数据(IEND)各字段的含义十六进制值描 述00 00 00 00IEND数据块的长度,00 00 00 00 = 049 45 4E 44数据块类型标志,49 45 4E 44的ASCII值等于IENDAE 42 60 82CRC值 pic1.png文件
39、格式已经分析完毕,pic2.png的文件格式可以参考上面pic1.png的分析,表5-25显示了pic1.png和pic2.png的文件结构区别。表5-25 pic1.png和pic2.png的文件结构区别pic1.png文件结构pic2.png文件结构IHDRIHDRpHYspHYsiCCPiCCPgAMAgAMAcHRMcHRMPLTEtRNSIDATIDATIENDIEND从表5-24可以看出pic2.png没有PLTE和tRNS数据块,因为pic2.png是16位色图像不需要使用调色板。PNG图像文件存储的数据块比较多,一般情况每个PNG图像文件的iCCP、gAMA和cHRM数据块中的
40、数据是一样的,只有IHDR和pHYs两个数据块中某些字段数据不同,如图5-28所示。 (点击查看大图)图5-28 两张不同的PNG格式图像的区别 (点击查看大图)图5-28 两张不同的PNG格式图像的区别所 以很多时候游戏编程人员为了节省游戏资源占用的硬盘空间,去掉了PNG图像文件的某些数据块。如果游戏的资源打包文件包含了PNG图像文件,但去掉了 PNG某些数据块,这样对分析游戏资源包文件格式带来了一定的困难,但幸好PNG图像文件的某些数据块还是要保留的,例如图像数据块(IDAT),通过识 别某些数据块的标识字符串还是比较容易识别出PNG格式的。PNG文件结构分析之一 dayf,2009-08
41、-16 15:07:43前言我 们都知道,在进行J2ME的手机应用程序开发的时候,在图片的使用上,我们可以使用PNG格式的图片(甚至于在有的手机上,我们只可以使用PNG格式的图 片),尽管使用图片可以为我们的应用程序增加不少亮点,然而,只支持PNG格式的图片却又限制了我们进一步发挥的可能性(其实,应该说是由于手机平台上的 处理能力有限)。 在MIDP2中,或者某些厂商(如NOKIA)提供的API中,提供了drawPixels/getPixels的方法,这些方法进一步提高了开发者处理 图片的灵活性,然而,在MIDP2还未完全普及的今天,我们需要在MIDP1 .0中实现这类方法还属于异想天开,因此
42、,为了实现更高级的应用,我们必须充分挖掘PNG的潜力。PNG的文件结构对于一个PNG文件来说,其文件头总是由位固定的字节来描述的:十进制数137 80 78 71 13 10 26 10十六进制数89 50 4E 47 0D 0A 1A 0A其中第一个字节0 x89超出了ASCII字符的范围,这是为了避免某些软件将PNG文件当做文本文件来处理。文件中剩余的部分由3个以上的PNG的数据块(Chunk)按照特定的顺序组成,因此,一个标准的PNG文件结构应该如下:PNG文件标志PNG数据块PNG数据块PNG数据块(Chunk)PNG 定义了两种类型的数据块,一种是称为关键数据块(critical c
43、hunk),这是标准的数据块,另一种叫做辅助数据块(ancillary chunks),这是可选的数据块。关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们,PNG读写软件也都必须要支持这些数据块。虽然 PNG文件规范没有要求PNG编译码器对可选数据块进行编码和译码,但规范提倡支持可选数据块。下表就是PNG中数据块的类别,其中,关键数据块部分我们使用深色背景加以区分。PNG文件格式中的数据块数据块符号数据块名称多数据块可选否位置限制IHDR 文件头数据块 否 否 第一块 cHRM 基色和白色点数据块 否 是在PLTE和IDAT之前gAMA 图像数据块 否 是在PLTE和IDAT之前
44、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 压缩文本数据块
45、 是是无限制 fRAc (专用公共数据块) 是是无限制 gIFg (专用公共数据块) 是是无限制 gIFt (专用公共数据块) 是是无限制 gIFx (专用公共数据块) 是是无限制 IEND 图像结束数据 否 否 最后一个数据块 为了简单起见,我们假设在我们使用的PNG文件中,这4个数据块按以上先后顺序进行存储,并且都只出现一次。数据块结构PNG文件中,每个数据块由4个部分组成,如下:名称字节数说明Length (长度) 4字节 指定数据块中数据域的长度,其长度不超过(2311)字节 Chunk Type Code (数据块类型码) 4字节 数据块类型码由ASCII字母(A-Z和a-z)组成
46、Chunk Data (数据块数据) 可变长度 存储按照Chunk Type Code指定的数据 CRC (循环冗余检测) 4字节 存储用来检测是否有错误的循环冗余码 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下面,我们依次来了解一下各个关键数据块的结构吧。IHDR文件头数据块IHDR(he
47、ader 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或162:真彩色图像,8或163:索引彩色图像,1,2,4或84:带通道
48、数据的灰度图像,8或166:带通道数据的真彩色图像,8或16 Compression method 1 byte 压缩方法(LZ77派生算法) Filter method 1 byte 滤波器方法 Interlace method 1 byte 隔行扫描方法:0:非隔行扫描1: Adam7(由Adam M. Costello开发的7遍隔行扫描方法) 由于我们研究的是手机上的PNG,因此,首先我们看看MIDP1.0对所使用PNG图片的要求吧:在MIDP1.0中,我们只可以使用1.0版本的PNG图片。并且,所以的PNG关键数据块都有特别要求:IHDR文件大小:MIDP支持任意大小的PNG图片,然而
49、,实际上,如果一个图片过大,会由于内存耗尽而无法读取。颜色类型:所有颜色类型都有被支持,虽然这些颜色的显示依赖于实际设备的显示能力。同时,MIDP也能支持alpha通道,但是,所有的alpha通道信息都会被忽略并且当作不透明的颜色对待。色深:所有的色深都能被支持。压缩方法:仅支持压缩方式0(deflate压缩方式),这和jar文件的压缩方式完全相同,所以,PNG图片数据的解压和jar文件的解压可以使用相同的代码。(其实这也就是为什么J2ME能很好的支持PNG图像的原因:)滤波器方法:尽管在PNG的白皮书中仅定义了方法0,然而所有的5种方法都被支持!隔行扫描:虽然MIDP支持0、1两种方式,然而
50、,当使用隔行扫描时,MIDP却不会真正的使用隔行扫描方式来显示。PLTE chunk:支持IDAT chunk:图像信息必须使用5种过滤方式中的方式0 (None, Sub, Up, Average, Paeth)IEND chunk:当IEND数据块被找到时,这个PNG图像才认为是合法的PNG图像。可选数据块:MIDP可以支持下列辅助数据块,然而,这却不是必须的。bKGD cHRM gAMA hIST iCCP iTXt pHYssBIT sPLT sRGB tEXt tIME tRNS zTXt关于更多的信息,可以参考PLTE调色板数据块PLTE(palette chunk)包含有与索引彩
51、色图像(indexed-color image)相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前。PLTE数据块是定义图像的调色板信息,PLTE可以包含1256个调色板信息,每一个调色板信息由3个字节组成:颜色字节意义Red1 byte0 = 黑色, 255 = 红Green1 byte0 = 黑色, 255 = 绿色Blue1 byte0 = 黑色, 255 = 蓝色 因此,调色板的长度应该是3的倍数,否则,这将是一个非法的调色板。对于索引图像,调色板信息是必须的,调色板的颜色索引从0开始编号,然后是1、2,调色板的颜色数不能超过色深中规定的颜色数(如图像色深为4的时候,调色板中的颜色数不可以超过24=16),否则,这将导致PNG图像不合法。真彩色图像和带通道数据的真彩色图像也可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。IDAT图像数据块IDAT(image data chunk):它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。IDAT存放着图像真正的数据信息,因此,如果能够了解IDAT的结构,我们就可以很方便的生成PNG图像。IEND图像结束数据
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年卫生管理课程大纲试题及答案
- 学校早餐粥配送合同协议
- Unit 7 Lesson37 教学设计 2024-2025学年冀教版英语八年级上册
- 婚庆项目外包合同协议
- 宠物销售协议书范本
- 安全施工管理协议书范本
- 临床执业医师考试临床路径试题及答案
- 家庭小鱼池施工合同协议
- 婚纱摄影基地合同协议
- 安装监控设施合同协议
- 2023年中国铁路上海局集团有限公司招聘3163人二(高职院校)笔试参考题库附带答案详解
- 内墙石膏抹灰合同样本
- 2025随州高新技术产业投资限公司工作人员招聘【24人】易考易错模拟试题(共500题)试卷后附参考答案
- 武汉数学四调试题及答案
- 生物制药考试题(附答案)
- 消防安全知识四懂四会
- 第6.2课 《青纱帐-甘蔗林》课件-【中职专用】高一语文同步课堂(高教版2023基础模块下册)
- 毕业设计(论文)-玉米收割机设计
- 2025年-陕西省建筑安全员《C证》考试题库及答案
- 第七章-《新制度经济学》制度变迁理论
- 晋江文件归档目录
评论
0/150
提交评论