- 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 | 图像深度: |
ColorType | 1 byte | 颜色类型: 4:带α通道数据的灰度图像,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