PNG图片格式分析格式

PNG文件格式

  1. PNG总体格式

一个PNG文件是由8字节的文件标志和按照特定结构组织的3个以上的数据块(chunk)构成的,结构如所示。具体结构如图1、图2所示

 

 PNG文件结构

 

图1  包含调色板数据块(PLTE)的PNG图像文件格式

 

图2  不包含调色板数据块(PLTE)的PNG图像文件格式

(注:1表示:只有1个;+表示:1个或多个;?表示:0个或1个;*表示:0个或多个;|表示:2选1)

2.PNG文件标志

对于一个PNG文件来说,其文件头总是由位固定的字节来描述的,8字节的PNG文件标志用来识别该文件是不是PNG文件。该域的值如表1所示。

十进制数

137

80

78

71

13

10

26

10

十六进制数

89

50

4E

47

0D

0A

1A

0A

表1

其中第一个字节Ox89超出了ASCII字符的范围,这是为了避免某些软件将PNG文件当做文本文件来处理。

3.PNG数据块

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

字  段  名

大小(单位:字节)

描    述

Length(长度)

4

指定数据块中的数据长度

Chunk Type Code(数据块类型码)

4

数据块类型,例如

IHDR、PLTE、IDAT等

Chunk Data(数据块数据)

Length

存储数据

CRC(循环冗余检测)

4

循环冗余码

表2

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

关键数据块(critical chunks)由4部分组成:文件头数据块(IHDR)、调色板数据块(PLTE)、图像数据块(IDAT)和图像结束数据(IEND),其中调色板数据块(PLTE)根据图像的色深可选。关键数据块组值顺序如表3所示。

数据块名称

允许多个数据块

位    置

文件头数据块(IHDR)

不允许

第一个数据块

调色板数据块(PLTE)

不允许

第二个数据块,可选

图像数据块(IDAT)

允许

如果有调色板数据块(PLTE),则是第三个数据块,如果没有调色板数据块(PLTE),则时第二个数据块。如果有多个图像数据块,则必须按图像数据连续存储

图像结束数据(IEND)

不允许

最后一个数据块

表3

辅助数据块(ancillary chunks)一共有14个,这些辅助数据块包含了很多信息,辅助数据块不是必须包含的。辅助数据块组值顺序如表4所示。(具体每种数据块格式可以参考:https://www.w3.org/TR/PNG/index-noobject.html#11sRGB)

数据块名称

允许多个数据块

位    置

基色和白色点数据块(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

允许

无限制

表4

关键数据块

1)头文件数据块IHDR(header chunk)

文件头数据块IHDR(header chunk):它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。文件头数据块由13字节组成,它的格式如表5所示。

域的名称

字节数

说明

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
遍隔行扫描方法)

表5

2)调色板数据块PLTE(palette chunk)

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

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

域的名称

字节数

字节数

Red

1 byte

0 = 黑,255 = 红

Green

1 byte

0 = 黑,255 = 绿

Blue

1 byte

0 = 黑,255 = 蓝

表6

3)图像数据块IDAT(image data chunk)

它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。

4)图像结束数据IEND(image trailer chunk)

它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。

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

  • 举例分析

如图3是一个5*3的.png格式的图片的二进制形式。

 

 

图3

如图4前八个字节是文件标志

 

图4

1.文件头数据块IHDR

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

 

图5

表7表示图像文件中文件头数据块(IHDR)的各字段含义。

十六进制值

描    述

00 00 00 0D

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

49 48 44 52

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

00 00 00 05

图像宽度:5

00 00 00 03

图像高度:3

08

色深,表示2的8次方256色

06

表示带α通道数据的真彩色图像(没有PLTE)

00

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

00

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

00

表示隔行扫描

5B 36 C5 F8

表示CRC

表7

2.标准RPG颜色数据块(sRGB

图6为图像文件中标准RPG颜色数据块(sRGB),表8所示为图像文件中标准RPG颜色数据块(sRGB)中各字段的含义。

 

图6

十六进制值

描    述

00 00 00 01

数据块的长度,00 00 00 01 =1

73 52 47 42

数据块类型标志,73 52 47 42的ASCII值等于sRGB

00

感知法:以牺牲色度精度为代价,更倾向于良好适应输出设备色域的图像,例如照片

AE CE 1C E9

CRC值

3.图像γ数据块(gAMA)

图7为图像文件中gAMA数据块,表9所示为图像文件中gAMA数据块中各字段的含义。

 

图7

十六进制值

描    述

00 00 00 04

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

67 41 4D 41

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

00 00B1 8F

gamma校正信息

7C F8 51 93

CRC值

表9

4.物理像素尺寸数据块(pHYs)

图8为图像文件中物理像素尺寸数据块(pHYs),表10所示为图像文件中物理像素尺寸数据块(pHYs)中各字段的含义。

 

图 8

十六进制值

描    述

00 00 00 09

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

70 48 59 73

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

00 00 19 D6

x轴上每米像素的数量,00 00 19 D6= 6614,即每米6614个像素

00 00 19 D6

y轴上每米像素的数量,00 00 19 D6 = 6614,即每米6614个像素

01

Meter=1,将单位定义为米

18 D1 CA ED

CRC值

表10

5.图像数据块IDAT

图9为图像文件中图像数据块IDAT,表11所示为图像文件中图像数据块IDAT中各字段的含义。

 

图9

十六进制值

描    述

00 00 00 4A

IDAT数据块的长度,00 00 00 4A = 76

49 44 41 54

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

18~47

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

3E 5D 9F 08

CRC值

表11

6.图像结束数据IEND(image trailer chunk)

图10为图像文件中图像数据块IDAT,表12所示为图像文件中图像数据块IDAT中各字段的含义。

 

图10

十六进制值

描    述

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值

表12

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值