PNG格式分析
文章目录
一、PNG文件格式概述
流式网络图形格式(Portable Network Graphic Format,PNG)名称来源于非官方的“PNG’s Not GIF”,是一种位图文件(bitmap file)存储格式,读成“ping”。
PNG是20世纪90年代中期开始开发的图像文件存储格式,其目的是企图替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性。
PNG用来存储灰度图像时,灰度图像的深度可多到16位,存储彩色图像时,彩色图像的深度可多到48位,并且还可存储多到16位的α通道数据。PNG使用从LZ77派生的无损数据压缩算法。
二、PNG基础
1. 文件头
对于一个PNG文件来说,其文件头由固定的字节来描述:
十进制数 | 137 80 78 71 13 10 26 10 |
---|---|
十六进制数 | 89 50 4E 47 0D 0A 1A 0A |
2. 文件数据块Chunk
1)数据块结构
PNG的每一个数据块又可分为四个域,分别为长度、类型、数据域、循环冗余检测。
-
长度:显示数据字段的长度信息,为4字节无符号整数,故数据长度限制在(2^31-1)字节。
-
类型:为4字节数据块类型码,为了便于描述和检查PNG文件,类型代码仅限于大写和小写的ASCII字母。
-
数据域:存储按照数据块类型码指定的数据, 该字段可以是长度为零。
-
循环冗余检测:一个4字节的CRC(循环冗余校验)计算,在所述块的前面的字节,包括该块类型的代码和数据块的数据字段,但是不包括长度字段。 CRC始终存在,即使不包含数据块。
名称 字节数 说明 长度Length 4 指定数据块中数据域的长度,其长度不超过(231 -1)字节 数据块类型码Chunk Type Code 4 数据块类型码由ASCII字母(A-Z和a-z)组成 数据块数据Chunk Data 可变(应与Length值相等) 存储按照Chunk Type Code指定的数据 循环冗余检测CRC 4 存储用来检测是否有错误的循环冗余码
2) 数据块分类Chunk Data
a. 关键数据块critical chunk
(1)文件头数据块IHDR
13字节,描述了图片的一些元数据
域名 | 字节数 | 说明 |
---|---|---|
Width | 4 | 图像宽度 |
Height | 4 | 图像高度 |
Bit depth | 1 | 比特深度索引(indexed) 彩色图像: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 |
Compression method | 1 | 压缩方法 |
Filter method | 1 | 滤波器方法 |
Interlace method | 1 | 非隔行扫描为0、隔行为1 |
(2)图像数据块IDAT
存放着图像真正的数据信息,在数据流中可包含多个连续顺序的图像数据块。
- 允许编码器根据需要将压缩的数据流分为多个IDAT块,但它们必须连续出现;
- 不限定IDAT块的大小,但过短的IDAT块会浪费更多空间;
- IDAT块可以出现在压缩数据流的任何位置。
(3)调色板数据块PLTE
PLTE数据块是定义图像的调色板信息,PLTE可以包含1~256个调色板信息,每一个调色板信息由3个字节组成,因此调色板数据块所包含的最大字节数为768,调色板的长度应该是3的倍数,否则,这将是一个非法的调色板。
对于索引图像,调色板信息是必须的,而且要放在图像数据块(image data chunk)之前。调色板的颜色索引从0开始编号,然后是1、2……,调色板的颜色数不能超过色深中规定的颜色数(如图像色深为4的时候,调色板中的颜色数不可以超过2^4=16),否则,这将导致PNG图像不合法。
颜色 | 字节数 | 说明 |
---|---|---|
Red | 1 | 0黑 255红 |
Green | 1 | 0黑 255绿 |
Blue | 1 | 0黑 255蓝 |
(4)图像结束数据块IEND
12个字节,标志着图像的结束,没有真正的数据内容,因此Length字段为0
IEND数据块字段:00 00 00 00 49 45 4E 44 AE 42 60 82 |
---|
b. 辅助数据块ancillary chunks
辅助数据块主要包含以下4类、14种:
- 表示透明信息(Transparency information)的数据块:
- tRNS chunk(Transparency chunk,透明信息数据块)
表示色彩空间信息(Colour space information)的数据块: - gAMA chunk(Image gamma chunk,图像γ数据块)
- cHRM chunk(Primary chromaticities chunk,基色和白色度数据块)
- sRGB chunk(Standard RGB colour space chunk,标准RGB色彩空间数据块)
- iCCP chunk(Embedded ICC profile chunk)
- tRNS chunk(Transparency chunk,透明信息数据块)
- 表示文本信息(Textual information)的数据块:
- tEXt chunk(Textual data chunk,文本信息数据块)
- zTXt chunk(Compressed textual data chunk,压缩文本数据块)
- iTXt chunk(International textual data chunk)
- 表示其他信息(Miscellaneous information)的数据块:
- bKGD chunk(Background colour chunk,背景颜色数据块)
- pHYs chunk(Physical pixel dimensions chunk,物理像素尺寸数据块)
- sBIT chunk(Significant bits chunk,样本有效位数据块)
- sPLT chunk(Suggested palette chunk)
- hIST chunk(Palette histogram chunk,图像直方图数据块)
- tIME chunk(Image last-modification time chunk,图像最后修改时间数据块)
三、案例分析
panda.png图片如下
1. 文件头
前8个字节即为PNG文件的固定标识,十六进制数据 89 50 4E 47 0D 0A 1A 0A
2. 文件数据块
(1)文件头数据块IHDR
含义 | 值 | 说明 |
---|---|---|
长度 | 00 00 00 0D | IHDR长度13字节 |
标识该块类型 | 49 48 44 52 | IHDR标识 |
含义 | 值 | 说明 |
---|---|---|
宽 | 00 00 02 19 | 537像素 |
高 | 00 00 01 F5 | 501像素 |
比特深度 | 08 | 2^8=256,即这是一个256色的图像 |
颜色类型 | 06 | 真彩色图像 |
压缩方法 | 00 | LZ77派生算法,目前仅定义了0 |
滤波 | 00 | 目前仅定义了0 |
扫描方式 | 00 | 非隔行扫描 |
CRC | 5B 74 EC EF | 循环冗余校验 |
(2)辅助数据块—pHYs chunk
含义 | 值 | 说明 |
---|---|---|
长度 | 00 00 00 09 | pHYs长度9字节 |
标识该块类型 | 70 48 59 73 | pHYs标识 |
CRC | 49 52 24 F0 | 循环冗余校验 |
(3)调色板数据块PLTE
本例真彩色图像没有PLTE
(4)图像数据块IDAT
本例包含多个连续的图像数据块。
含义 | 值 | 说明 |
---|---|---|
长度 | 00 00 20 00 | 长度8192字节 |
标识该块类型 | 49 44 41 54 | IDAT标识 |
下面8192字节为图像数据
(5)图像结束数据块IEND
文件最后几个字节固定是00 00 00 00 49 45 4E 44 AE 42 60 82
含义 | 值 | 说明 |
---|---|---|
长度 | 00 00 00 00 | 长度0 |
标识该块类型 | 49 45 4E 44 | IEND标识 |
CRC | AE 42 60 82 | 循环冗余校验 |