PNG文件格式
一.概述
PNG是20世纪90年代中期开始开发的图像文件存储格式,其目的是替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性。流式网络图形格式(Portable Network Graphic Format,PNG)名称来源于非官方的“PNG's Not GIF”,是一种位图文件(bitmap file)存储格式,读成“ping”。PNG用来存储灰度图像时,灰度图像的深度可多到16位,存储彩色图像时,彩色图像的深度可多到48位,并且还可存储多到16位的α通道数据。PNG使用从LZ77派生的无损数据压缩算法。
PNG文件格式保留GIF文件格式的下列特性:
1.使用彩色查找表或者叫做调色板可支持256种颜色的彩色图像。
2.流式读/写性能(streamability):图像文件格式允许连续读出和写入图像数据,这个特性很适合于在通信过程中生成和显示图像。
3.逐次逼近显示(progressive display):这种特性可使在通信链路上传输图像文件的同时就在终端上显示图像,把整个轮廓显示出来之后逐步显示图像的细节,也就是先用低分辨率显示图像,然后逐步提高它的分辨率。
4.透明性(transparency):这个性能可使图像中某些部分不显示出来,用来创建一些有特色的图像。
5.辅助信息(ancillary information):这个特性可用来在图像文件中存储一些文本注释信息。
6.独立于计算机软硬件环境。
7.使用无损压缩。
PNG文件格式中要增加下列GIF文件格式所没有的特性:
1.每个像素为48位的真彩色图像。
2.每个像素为16位的灰度图像。
3.可为灰度图和真彩色图添加α通道。
4.添加图像的γ信息。
5.使用循环冗余码(cyclic redundancy code,CRC)检测损害的文件。
6.加快图像显示的逐次逼近显示方式。
7.标准的读/写工具包。
8.可在一个文件中存储多幅图像。
二.文件格式
文件结构
PNG图像格式文件(或者称为数据流)由一个8字节的PNG文件署名(PNG file signature)域和按照特定结构组织的3个以上的数据块(chunk)组成。
PNG定义了两种类型的数据块,一种是称为关键数据块(critical chunk),这是标准的数据块,另一种叫做辅助数据块(ancillary chunks),这是可选的数据块。关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们,PNG读写软件也都必须要支持这些数据块。虽然PNG文件规范没有要求PNG编译码器对可选数据块进行编码和译码,但规范提倡支持可选数据块。
(1) PNG文件署名域
8字节的PNG文件署名域用来识别该文件是不是PNG文件。该域的值是:
十进制数 |
137 |
80 |
78 |
71 |
13 |
10 |
26 |
10 |
十六进制数 |
89 |
50 |
4e |
47 |
0d |
0a |
1a |
0a |
对于一个PNG文件来说,其文件头总是由该64位固定的字节来描述的,其中第一个字节0x89超出了ASCII字符的范围,这是为了避免某些软件将PNG文件当做文本文件来处理。
(2) 数据块的结构
每个数据块都由表6-07所示的的4个域组成。
表6-07 PNG文件数据块的结构
名称 |
字节数 |
说明 |
Length(长度) |
4字节 |
指定数据块中数据域的长度,其长度不超过 |
Chunk Type Code(数据块类型码) |
4字节 |
数据块类型码由ASCII字母(A-Z和a-z)组成 |
Chunk Data(数据块数据) |
可变长度 |
存储按照Chunk Type Code指定的数据 |
CRC(循环冗余检测) |
4字节 |
存储用来检测是否有错误的循环冗余码 |
在表6-07中,CRC(cyclic redundancy check)域中的值是对Chunk Type Code域和Chunk Data域中的数据进行计算得到的。CRC具体算法定义在ISO 3309和ITU-T V.42中,其值按下面的CRC码生成多项式进行计算:
x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
数据块结构
1. 关键数据块
关键数据块中的4个标准数据块是:
(1) 文件头数据块