解析PNG图像文件.docx

上传人:b****6 文档编号:6259183 上传时间:2023-01-04 格式:DOCX 页数:38 大小:1.45MB
下载 相关 举报
解析PNG图像文件.docx_第1页
第1页 / 共38页
解析PNG图像文件.docx_第2页
第2页 / 共38页
解析PNG图像文件.docx_第3页
第3页 / 共38页
解析PNG图像文件.docx_第4页
第4页 / 共38页
解析PNG图像文件.docx_第5页
第5页 / 共38页
点击查看更多>>
下载资源
资源描述

解析PNG图像文件.docx

《解析PNG图像文件.docx》由会员分享,可在线阅读,更多相关《解析PNG图像文件.docx(38页珍藏版)》请在冰豆网上搜索。

解析PNG图像文件.docx

解析PNG图像文件

PNG图像文件介绍

PNG图像文件格式

PNG是可携式网络图像(portablenetworkgraphics)的英文缩写。

PNG是从网络上开始发展的,目的是替代GIF和JPG格式,PNG图像文件格式也是当今游戏中常用的图像资源文件格式了。

PNG图像文件支持的图像颜色非常丰富,存储灰度图时可使用16位色深表示,存储真彩色图像时色深更可达到48位之多。

PNG图像文件介绍

与BMP格式相比,PNG格式稍微复杂些。

PNG图像支持从0~255级次的多层透明色,使用无损压缩的zlib压缩算法压缩图像数据。

通常使用zlib压缩过的图像文件大小比BMP使用的RLE压缩的效果好,BMP的RLE压缩算法只支持压缩8位以下的图像,对于16位以上的真彩色图像不支持图像压缩,PNG使用的zlib压缩算法支持任何色深的图像数据压缩,压缩后的图像数据可以完整还原,相比之下JPG需要牺牲图像质量使用有损压缩来获得大的压缩率。

最后有一点需要注意,PNG图像格式使用Big-Endian顺序存储数据。

PNG图像文件存储结构

(1)

PNG文件存储结构的格式可以在http:

//www.w3.org/TR/REC-png.htm上找到定义。

BMP文件总体上由两部分组成,分别是PNG文件标志和数据块(chunks),如表5-8所示。

其中数据块分为两类:

关键数据块(criticalchunk)和辅助数据块(ancillarychunks)。

表5-8PNG文件的组成结构

PNG文件标志

数据块(chunks)

1.PNG文件标志

PNG文件标志由8字节数据组成:

89504E470D0A1A0Ah,其中504E47对应的ASCII值是"PNG"。

2.数据块(chunks)

紧跟在PNG文件标志后面的数据是数据块(chunks),数据块(chunks)分为两类:

关键数据块(criticalchunks)和辅助数据块(ancillarychunks)。

关键数据块(criticalchunk)在PNG文件中是必须有的,而辅助数据块(ancillarychunks)是可选的。

关键数据块(criticalchunks)由4部分组成:

文件头数据块(IHDR)、调色板数据块(PLTE)、图像数据块(IDAT)和图像结束数据(IEND),其中调色板数据块(PLTE)根据图像的色深可选。

辅助数据块(ancillarychunks)一共有14个,这些辅助数据块包含了很多信息,辅助数据块不是必须包含的。

PNG文件的关键数据块和辅助数据块的组织顺序如表5-9和表5-10所示。

表5-9PNG文件的关键数据块(criticalchunks)组织顺序

数据块名称

允许多

个数据块

位置

文件头数据块(IHDR)

不允许

第一个数据块

调色板数据块(PLTE)

不允许

第二个数据块,可选

图像数据块(IDAT)

允许

如果有调色板数据块(PLTE),则是第三个数据块,如果没有调色板数据块(PLTE),则时第二个数据块。

如果有多个图像数据块,则必须按图像数据连续存储

图像结束数据(IEND)

不允许

最后一个数据块

表5-10PNG文件的辅助数据块(ancillarychunks)组织顺序

数据块名称

允许多个

数据块

位置

基色和白色点数据块(cHRM)

不允许

在PLTE和IDAT之前

图像γ数据块(gAMA)

不允许

在PLTE和IDAT之前

ICCP(iCCP)

允许

在PLTE之后IDAT之前如果有iCCP,则无sRGB

 

续表

数据块名称

允许多个

数据块

位置

样本有效位数据块(sBIT)

不允许

在PLTE和IDAT之前

标准RPG颜色(sRGB)

不允许

在PLTE之后IDAT之前如

果有sRGB,则无iCCP

背景颜色数据块(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图像文件格式

(点击查看大图)图5-14不包含调色板数据块(PLTE)的PNG图像文件格式

图中上标的含义如表5-11所示。

表5-11上标的含义

符号

含义

1

只有1个

+

1个或多个

0个或1个

*

0个或多个

|

2选1

PNG图像文件中每一块数据块的格式都是相同的,分别由4个部分组成,格式如表5-12所示。

表5-12PNG文件的数据块格式

字段名

大小(单

位:

字节)

描述

Length(长度)

4

指定数据块中的数据长度

ChunkTypeCode(数据块类型码)

4

数据块类型,例如

IHDR、PLTE、IDAT等

ChunkData(数据块数据)

Length

存储数据

CRC(循环冗余检测)

4

循环冗余码

CRC循环冗余码生成的计算方式是通过对ChunkTypeCode和ChunkData中的数据进行计算得到的,计算方式如下:

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

PNG图像文件存储结构(3)

下面将讲解在PNG文件中的4个关键数据块(criticalchunk)的含义。

①文件头数据块(IHDR)

文件头数据块(IHDR)它包含有PNG文件中存储的图像数据的基本信息,如图像的宽高、色深、颜色类型、压缩方式等。

一个PNG文件只能有一个文件头数据块,表5-13列出了文件头数据块(IHDR)中各字段的含义。

表5-13文件头数据块(IHDR)中各字段的含义

字段名

大小(单

位:

字节)

描述

Width

4

图像宽度,以像素为单位

Height

4

图像高度,以像素为单位

Bitdepth

1

图像深度:

索引彩色图像:

1,2,4或8

灰度图像:

1,2,4,8或16

真彩色图像:

8或16

ColorType

1

颜色类型:

0:

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

2:

真彩色图像,8或16

3:

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

4:

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

6:

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

Compression

method

1

压缩方法(LZ77变种算法)

Filtermethod

1

滤波器方法

Interlace

method

1

隔行扫描方法:

0:

非隔行扫描

1:

Adam7(由AdamM.

Costello开发的7遍隔行扫描方法)

文件头数据块(IHDR)结构可以使用如下代码定义:

typedefstruct{

DWORDbtChunkLen;

CHARbtChunkType[4];

}PNG_CHUNK_HEADER;

typedefenumpngColorSpaceType{

GrayScale=0,

TrueColor=2,

Indexed=3,

AlphaGrayScale=4,

AlphaTrueColor=6

}PNG_COLOR_SPACE_TYPE;

//CompressionMethods

typedefenumpngCompressionMethod{

Deflate=0

}PNG_COMPR_METHOD;

//FilterMethods

typedefenumpngFilterMethod{

AdaptiveFiltering=0

}PNG_FILTER_METHOD;

//InterlaceMethods

typedefenumpngInterlaceMethod{

NoInterlace=0,

Adam7Interlace=1

}PNG_INTERLACE_METHOD;

//IHDRdata

typedefstruct{

UINTwidth;

UINTheight;

BYTEbit_depth;

PNG_COLOR_SPACE_TYPEcolor_type;

PNG_COMPR_METHODcompr_method;

PNG_FILTER_METHODfilter_method;

PNG_INTERLACE_METHODinterlace_method;

}IHDR_CHUNK_DATA;

②调色板数据块(PLTE)

PNG的调色板数据块(PLTE)和之前介绍BMP图像格式中的调色板类似,都是提供给8位色深以下的图像使用。

PNG的调色板由3个字节组成,每个字节分别表示红、绿、蓝三色的颜色值。

对于PNG图像文件来说,大于8位色深的图像,如真彩色图像也可以使用调色板,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。

一个PNG文件只能有一个调色板数据块,调色板数据块从下标0开始,表5-14列出了调色板数据块(PLTE)中各字段的含义。

表5-14调色板数据块(PLTE)中各字段的含义

字段名

大小(单

位:

字节)

描述

btRed

1

红色颜色值

btGreen

1

绿色颜色值

btBlue

1

蓝色颜色值

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

typedefstruct{

BYTEbtRed;

BYTEbtGreen;

BYTEbtBlue;

}PNG_PALETTE_PIXEL;

PNG图像文件存储结构(4)

③图像数据块(IDAT)

PNG的图像数据块(IDAT)存储图像的实际数据,相当于BMP图像的图像数据,由于PNG可包含多幅图像,所以PNG的图像数据块可能是由一幅图像的数据组成,也可能是由多幅图像的数据组成。

图像数据块中的图像数据可能是经过变种的LZ77压缩编码DEFLATE压缩的,关于DEFLATE详细介绍可以参考《DEFLATECompressedDataFormatSpecificationversion1.3》,网址:

http:

//www.ietf.org/rfc/rfc1951.txt。

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

PNG_CHUNK_HEADERchunkHdr;

BYTEidatChunkData[chunkHdr.btChunkLen];

DWORDidatCrc;

④图像结束数据(IEND)

PNG的图像结束数据(IEND)用来标记PNG文件结束,并且必须要放在文件的尾部。

一般情况下,所有PNG图像结束数据(IEND)的十六进制数值都是一样的,具体的数值如下:

0000000049454E44AE426082

PNG的辅助数据块(ancillarychunks)一共有14个,可以分为5类,如表5-10所示,由于篇幅关系不能将全部辅助数据块(ancillarychunks)的详细结构进行说明,如果读者有兴趣请参考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图像的分辨率为200×150,文件大小为19534字节。

pic2.png图像的分辨率为200×150,文件大小为104744字节,带透明通道。

图5-15pic1.png图像

图5-16pic2.png图像

现在来分析pic1.png的图像文件,在Winhex中打开pic1.png,如图5-17所示。

(点击查看大图)图5-17在Winhex中打开pic1.png文件

首先分析PNG的文件标志。

根据PNG文件的定义,从文件头开始前8字节数据是PNG文件的标志,如图5-18所示。

(点击查看大图)图5-18PNG文件的文件标志

接下来应该就是PNG文件的数据块结构了,按照前面对PNG文件结构的分析,第一个数据块应该是文件头数据块(IHDR)数据块,文件头数据块(IHDR)定义了PNG文件的宽高、色深、压缩方法等参数,如图5-19所示。

(点击查看大图)图5-19文件头数据块(IHDR)结构

分析PNG图像文件结构

(2)

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

由于PNG文件使用Big-Endian顺序存储数据,所以不需要反转字节数据理解。

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

十六进制值

描述

0000000D

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

49484452

数据块类型标志,49484452的ASCII值等于IHDR

000000C8

图像的宽度,000000C8=200

00000096

图像的高度,00000096=150

08

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

03

03表示索引图像

00

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

00

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

00

00表示非隔行扫描

AC02372B

AC02372B表示CRC

从表5-14看到pic1.png文件的文件头数据块(IHDR)结构中的CRC字段的值为AC02372B,这个CRC值是按照从数据块类型标志字段到CRC字段前一字节的数据计算而来的,即使用数据49484452000000C8000000960803000000计算,CRC的计算代码如下:

/*8位消息的CRC表格*/

unsignedlongcrc_table[256];

/*Flag:

CRC表格计算完了吗?

初始化False*/

intcrc_table_computed=0;

/*写一个CRC表格*/

voidmake_crc_table(void)

{

unsignedlongc;

intn,k;

for(n=0;n<256;n++){

c=(unsignedlong)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表格*/

unsignedlongupdate_crc(unsignedlongcrc,unsignedchar*buf,

intlen)

{

unsignedlongc=crc;

intn;

if(!

crc_table_computed)

make_crc_table();

for(n=0;n

c=crc_table[(c^buf[n])&0xff]^(c>>8);

}

returnc;

}

/*返回CRC表格buf[0..len-1].*/

unsignedlongcrc(unsignedchar*buf,intlen)

{

returnupdate_crc(0xffffffffL,buf,len)^0xffffffffL;

}

main()

{

/*计算CRC需要的初始化数据,不同的数据块有不同的初始化数据*/

unsignedcharbuf[17]={

0x49,0x48,0x44,0x52,0x00,0x00,0x00,0xC8,0x00,

0x00,0x00,0x96,0x08,0x03,0x00,0x00,

0x00

};

unsignedlongvalue=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_HEADERchunkHdr;

uintphysPixelPerUnitX;

uintphysPixelPerUnitY;

enum{

UnkownUnit=0,

Meter=1

}pHYs;

DWORDpHYsCrc;

图5-20所示为pic1.png中的物理像素尺寸数据块(pHYs)的结构。

(点击查看大图)图5-20pic1.png中的物理像素尺寸数据块(pHYs)的结构

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

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

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

十六进制值

描述

00000009

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

70485973

数据块类型标志,70485973的ASCII值等于pHYs

00000B13

x轴上每米像素的数量,00000B13=2835,即每米2835个像素

00000B13

y轴上每米像素的数量,00000B13=2835,即每米2835个像素

01

Meter=1,将单位定义为米

009A9C18

CRC值

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

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

PNG_CHUNK_HEADERchunkHdr

typedefstruct{

stringprofile_name;

unsignedbytered;

}PNG_ICCP_CHUNK_DATA;

DWORDICCPCrc;

图5-21所示为pic1.png中的iCCP的数据结构。

(点击查看大图)图5-21pic1.png图像文件中iCCP数据块结构

(点击查看大图)图5-21pic1.png图像文件中iCCP数据块结构

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

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

十六进制值

描述

00000A4D

ICCP数据块的长度,00000A4D=2637

69434350

数据块类型标志,69434350的ASCII值等于iCCP

50686F746F73686F70204943432070726F66696C6500

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

50686F746F73686F70204943432070726F66696C6500的ASCII值等于PhotoshopICCprofile

00

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

78DA9D53~F784F3FB

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

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

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

PNG_CHUNK_HEADERchunkHdr;

BYTEgamaChunkData[chunkHdr.btChunkLen];

DWORDgamaCrc;

图5-22所示为pic1.png中的gAMA的数据结构:

(点击查看大图)图5-22pic1.png图像文件中gAMA数据块结构

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

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

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

十六进制值

描述

00000004

gAMA数据块的长度,00000004=4

67414D41

数据块类型标志,67414D41的ASCII值等于gAMA

0000B18E

gamma校正信息

7CF85193

CRC值

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

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

typedefstruct{

uintx;

uinty;

}PNG_POINT;

typedefstruct{

PNG_POINTwhite;

PNG_POINTred;

PNG_POINTgreen;

PNG_POINTblue;

}PNG_CHRM_CHUNK_DATA;

PNG_CHUNK_HEADERchunkHdr;

PNG_CHRM_CHUNK_DATAchrmChunkData;

DWORDchrmCrc;

图5-23所示为pic1.png中的cHRM的数据结构。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1