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
文件格式的下列特性:
- 使用彩色查找表或者叫做调色板可支持256种颜色的彩色图像。
- 流式读/写性能(streamability):图像文件格式允许连续读出和写入图像数据,这个特性很适合于在通信过程中生成和显示图像。
- 逐次逼近显示(progressive display):这种特性可使在通信链路上传输图像文件的同时就在终端上显示图像,把整个轮廓显示出来之后逐步显示图像的细节,也就是先用低分辨率显示图像,然后逐步提高它的分辨率。
- 透明性(transparency):这个性能可使图像中某些部分不显示出来,用来创建一些有特色的图像。
- 辅助信息(ancillary information):这个特性可用来在图像文件中存储一些文本注释信息。
- 独立于计算机软硬件环境。
- 使用无损压缩。
PNG
文件格式中要增加下列
GIF
文件格式所没有的特性:
- 每个像素为48位的真彩色图像。
- 每个像素为16位的灰度图像。
- 可为灰度图和真彩色图添加α通道。
- 添加图像的γ信息。
- 使用循环冗余码(cyclic redundancy code,CRC)检测损害的文件。
- 加快图像显示的逐次逼近显示方式。
- 标准的读/写工具包。
- 可在一个文件中存储多幅图像。
文件结构
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
|
(2)
数据块的结构
每个数据块都由表
6-07
所示的的
4
个域组成。
表
6-07 PNG
文件数据块的结构
名称
|
字节数
|
说明
|
Length(
长度
)
|
4
字节
|
指定数据块中数据域的长度,其长度不超过
(231 - 1) 字节 |
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)
文件头数据块
IHDR(header chunk)
:它包含有
PNG
文件中存储的图像数据的基本信息,并要作为第一个数据块出现在
PNG
数据流中,而且一个
PNG
数据流中只能有一个文件头数据块。
文件头数据块由
13
字节组成,它的格式如表
6-08
所示。
表
6-08 PNG
文件头键数据块的结构
域的名称
|
字节数
|
说明
|
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 遍隔行扫描方法 ) |
(2)
调色板数据块
PLTE(palette chunk)
:它包含有与索引彩色图像
((indexed-color image))
相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块
(image data chunk)
之前。真彩色的
PNG
数据流也可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。调色板数据块结构如表
6-09
所示。
表
6-09
调色板数据块结构
|
域的名称
|
字节数
|
说明
|
Red
|
1 byte
|
0 =
黑,
255 =
红
| |
Green
|
"> 0 =
黑,
255 =
绿
|
| |
Blue
|
1 byte
|
0 =
黑,
255 =
蓝
|
调色板实际是一个彩色索引查找表,它的表项数目可以是
1
~
256
中的一个数,每个表项有
3
字节,因此调色板数据块所包含的最大字节数为
768
。
(3)
图像数据块
IDAT(image data chunk)
:它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。
(4)
图像结束数据
IEND(image trailer chunk)
:它用来标记
PNG
文件或者数据流已经结束,并且必须要放在文件的尾部。
除了表示数据块开始的
IHDR
必须放在最前面, 表示
PNG
文件结束的
IEND
数据块放在最后面之外,其他数据块的存放顺序没有限制。
2.
辅助数据块
PNG
文件格式规范制定的
10
个辅助数据块是:
(1)
背景颜色数据块
bKGD(background color)
。
(2)
基色和白色度数据块
cHRM(primary chromaticities and white point)
。所谓白色度是指当
R
=
G
=
B
=最大值时在显示器上产生的白色度。
(3)
图像
γ
数据块
gAMA(image gamma)
。
(4)
图像直方图数据块
hIST(image histogram)
。
(5)
物理像素尺寸数据块
pHYs(physical pixel dimensions)
。
(6)
样本有效位数据块
sBIT(significant bits)
。
(7)
文本信息数据块
tEXt(textual data)
。
(8)
图像最后修改时间数据块
tIME (image last-modification time)
。
(9)
图像透明数据块
tRNS (transparency)
。
(10)
压缩文本数据块
zTXt (compressed textual data)
。
3.
数据块摘要
关键数据块、辅助数据块和专用公共数据块
(special-purpose public chunks)
综合在表
6-10
中。
表
6-10 PNG
文件格式中的数据块
数据块符号
|
数据块名称
|
多数据块
|
可选否
|
位置限制
|
IHDR
|
文件头数据块
|
否
|
否
|
第一块
|
cHRM
|
基色和白色点数据块
|
否
|
是
|
在
PLTE
和
IDAT
之前
|
gAMA
|
图像γ数据块
|
否
|
是
|
在
PLTE
和
IDAT
之前
|
sBIT
|
样本有效位数据块
|
否
|
是
|
在
PLTE
和
IDAT
之前
|
PLTE
|
调色板数据块
|
否
|
是
|
在
IDAT
之前
|
bKGD
|
背景颜色数据块
|
否
|
是
|
在
PLTE
之后
IDAT
之前
|
hIST
|
图像直方图数据块
|
否
|
是
|
在
PLTE
之后
IDAT
之前
|
tRNS
|
图像透明数据块
|
否
|
是
|
在
PLTE
之后
IDAT
之前
|
oFFs
|
(
专用公共数据块
)
|
否
|
是
|
在
IDAT
之前
|
pHYs
|
物理像素尺寸数据块
|
否
|
是
|
在
IDAT
之前
|
sCAL
|
(
专用公共数据块
)
|
否
|
是
|
在
IDAT
之前
|
IDAT
|
图像数据块
|
是
|
否
|
与其他
IDAT
连续
|
tIME
|
图像最后修改时间数据块
|
否
|
是
|
无限制
|
tEXt
|
文本信息数据块
|
是
|
是
|
无限制
|
zTXt
|
压缩文本数据块
|
是
|
是
|
无限制
|
fRAc
|
(
专用公共数据块
)
|
是
|
是
|
无限制
|
gIFg
|
(
专用公共数据块
)
|
是
|
是
|
无限制
|
gIFt
|
(
专用公共数据块
)
|
是
|
是
|
无限制
|
gIFx
|
(
专用公共数据块
)
|
是
|
是
|
无限制
|
IEND
|
图像结束数据
|
否
|
否
|
最后一个数据块
|
tEXt
和
zTXt
数据块中的标准关键字:
Title
|
图像名称或者标题
|
Author
|
图像作者名
|
Description
|
图像说明
|
Copyright
|
版权声明
|
CreationTime
|
原图创作时间
|
Software
|
创作图像使用的软件
|
Disclaimer
|
弃权
|
Warning
|
图像内容警告
|
Source
|
创作图像使用的设备
|
Comment
|
各种注释
|