文章目录
概述
流式网络图形格式(Portable Network Graphic Format,PNG)是一种位图文件(bitmap file)存储格式。PNG是20世纪90年代中期开始开发的图像文件存储格式,其目的是替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性。PNG用来存储灰度图像时,灰度图像的深度可多到16位,存储彩色图像时,彩色图像的深度可多到48位,并且还可存储多到16位的α通道数据。PNG使用从LZ77派生的无损数据压缩算法。
PNG文件结构
- PNG图像格式文件由一个8字节的PNG文件署名(PNG file signature)域和按照特定结构组织的3个以上的数据块(chunk)组成。
PNG标识符 | PNG数据块 (IHDR) | PNG数据块 (其他类型数据块) | … | PNG结尾数据块 (IEND) |
---|
1.PNG标识符(文件署名域)
PNG文件署名域由固定的8字节的来表示,用于识别该文件是不是PNG文件。
十进制数 | 137 80 78 71 13 10 26 10 |
---|---|
十六进制数 | 89 50 4E 47 0D 0A 1A 0A |
2. PNG数据块
(1)数据块格式
名称 | 长度 | 说明 |
---|---|---|
Length (长度) | 4字节 | 指定数据块中数据域的长度 |
Chunk Type Code (数据块类型码) | 4字节 | 由ASCII字母(A-Z和a-z)组成的“数据块符号” |
Chunk Data (数据块数据) | - | 存储按照Chunk Type Code指定的数据 |
CRC(循环冗余检测) | 4字节 | 存储用来检测是否有错误的循环冗余码 |
(2)数据块类型
PNG定义了两种类型的数据块,一种是称为关键数据块(critical chunk),这是标准的数据块,另一种叫做辅助数据块(ancillary chunks),这是可选的数据块。
<1>关键数据块
关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们,PNG读写软件也都必须要支持这些数据块。虽然PNG文件规范没有要求PNG编译码器对可选数据块进行编码和译码,但规范提倡支持可选数据块。
数据块符号 | 数据块名称 | 多数据块 | 是否可选 | 位置限制 |
---|---|---|---|---|
IHDR | 文件头数据块 | 否 | 否 | 第一块 |
PLTE | 调色板数据块 | 否 | 是 | 在IDAT之前 |
IDAT | 图像数据块 | 是 | 否 | 与其他IDAT连续 |
IEND | 图像结束数据 | 否 | 否 | 最后一个数据块 |
i.文件头数据块IHDR
- 它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。
- 文件头数据块数据域由13字节组成。格式如下表:
域的名称 | 字节数 | 说明 |
---|---|---|
Width | 4 | 表示图像宽度,以像素为单位 |
Height | 4 | 表示图像高度,以像素为单位 |
Bit depth | 1 | 表示图像深度 索引彩色图像:1,2,4或8 灰度图像:1,2,4,8或16 真彩色图像:8或16 |
Color Type | 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派生算法) |
Filter method | 1 | 滤波器方法 |
Interlace method | 1 | 隔行扫描方法: 0:非隔行扫描 1: Adam7(由Adam M. Costello开发的7遍隔行扫描方法) |
- 以上图为例:
00 00 00 0D:IHDR数据块数据域长为13
49 48 44 52:IHDR数据类型码(标识)
00 00 03 30:表示图像的宽度,816像素
00 00 04 DB:表示图像的高度,1243像素
08: 表示图像比特深度,即这是一个256色的图像
06: 表示颜色类型,即这是一个带α通道数据的真彩色图像
00: PNG Spec规定此处总为0(非0值为将来使用更好的压缩方法预留),
表示使压缩方法(LZ77派生算法)
00:表示滤波器方式
00:表示非隔行扫描
46 2C 50 D4:CRC校验码
ii. 调色数据块PLET
- 调色板数据块PLTE(palette chunk)包含有与索引彩色图像(indexed-color image)相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前。
- PLTE数据块是定义图像的调色板信息,PLTE可以包含1~256个调色板信息,每一个调色板信息由3个字节组成:
颜色 | 字节数 | 意义 |
---|---|---|
Red | 1 | 0 = 黑色, 255 = 红 |
Green | 1 | 0 = 黑色, 255 = 绿色 |
Blue | 1 | 0 = 黑色, 255 = 蓝色 |
iii. 图像数据块IDAT(image data chunk)
-
它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。
-
以上图为例
00 00 1A 3C :表示IDAT数据块数据域长度为6716字节
49 44 41 54 :表示IDAT数据块类型码(标识)
78 9C… … : 表示IDAT数据块数据域中数据
C9 26 D0 50 :CRC校验码
iv. 图像结束数据IEND(image trailer chunk)
- 它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。
- 以上图为例:
00 00 00 00 :一般IEND数据块数据域长度为0
49 45 4E 44 :表示IEND数据类型码(标识)
AE 42 60 82 :CRC 校验码
<2> 辅助数据块
数据块符号 | 数据块名称 | 多数据块 | 可选否 | 位置限制 |
---|---|---|---|---|
cHRM | 基色和白色点数据块 | 否 | 是 | 在PLTE和IDAT之前 |
gAMA | 图像γ数据块 | 否 | 是 | 在PLTE和IDAT之前 |
sBIT | 样本有效位数据块 | 否 | 是 | 在PLTE和IDAT之前 |
bKGD | 背景颜色数据块 | 否 | 是 | 在PLTE之后IDAT之前 |
hIST | 图像直方图数据块 | 否 | 是 | 在PLTE之后IDAT之前 |
tRNS | 图像透明数据块 | 否 | 是 | 在PLTE之后IDAT之前 |
oFFs | (专用公共数据块) | 否 | 是 | 在IDAT之前 |
pHYs | 物理像素尺寸数据块 | 否 | 是 | 在IDAT之前 |
sCAL | (专用公共数据块) | 否 | 是 | 在IDAT之前 |
tIME | 图像最后修改时间数据块 | 否 | 是 | 无限制 |
tEXt | 文本信息数据块 | 是 | 是 | 无限制 |
zTXt | 压缩文本数据块 | 是 | 是 | 无限制 |
fRAc | (专用公共数据块) | 是 | 是 | 无限制 |
gIFg | (专用公共数据块) | 是 | 是 | 无限制 |
gIFt | (专用公共数据块) | 是 | 是 | 无限制 |
gIFx | (专用公共数据块) | 是 | 是 | 无限制 |
- 以上图为例:
00 00 00 06 : 表示bKGD数据块数据域长度,为6字节
62 4B 47 44 :表示bKGD数据块类型码(标识)
00 FF 00 FF 00 FF:bKGD数据块数据
A0 BD A7 93:CRC 校验码
- 以上图为例
00 00 00 09:表示pHYs数据块数据域长度,为9字节
70 48 59 73:表示pHYs数据块类型码(标识)
00 00 0E C4 00 00 0E C4 01:pHYs数据块数据
95 2B 0E 1B:CRC校验码