目录
一、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文件结构
PNG图像格式文件(或者称为数据流)由一个8字节的PNG文件署名(PNG file signature)域和按照特定结构组织的3个以上的数据块(chunk)组成。
PNG定义了两种类型的数据块,一种是称为关键数据块(critical chunk),这是标准的数据块,另一种叫做辅助数据块(ancillary chunks),这是可选的数据块。关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们,PNG读写软件也都必须要支持这些数据块。虽然PNG文件规范没有要求PNG编译码器对可选数据块进行编码和译码,但规范提倡支持可选数据块。
下文将通过分析一幅分辨率为5×5的png样例图片来详细介绍PNG文件格式,该图片大部分区域为黑(灰度值0),仅右下角一个像素为白色(灰度值255)。
三、PNG文件署名域
在PNG文件前8字节的PNG文件署名域用来识别该文件是不是PNG文件。该域的值是:
十进制数 137 80 78 71 13 10 26 10
十六进制数 89 50 4e 47 0d 0a 1a 0a
在UltraEdit软件中打开样例图片文件。
可以看到前8字节为89 50 4E 47 0D 1A 0A。
四、PNG数据块
PNG文件中的每个数据块都由表1所示的的4个域组成。
名称 | 字节数 | 说明 |
Length(长度) | 4字节 | 指定数据块中数据域的长度 |
Chunk Type Code(数据块类型码) | 4字节 | 数据块类型码由ASCII字母(A-Z和a-z)组成 |
Chunk Data(数据块数据) | 可变长度 | 存储按照Chunk Type Code指定的数据 |
CRC(循环冗余检测) | 4字节 | 存储用来检测是否有错误的循环冗余码 |
PNG文件中的关键数据块的4个标准数据块分别是文件头数据块、调色板数据块、图像数据块、图像结束数据块。
4.1 文件头数据块
文件头数据块的数据块类型码为IHDR,它包含有PNG文件中存储的图像数据的基本信息,并作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。文件头数据块由13字节组成,它的格式如表2所示。
域的名称 | 字节数 | 说明 |
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遍隔行扫描方法) |
在样例图片数据中,红线部分代表第一个数据块的数据域长度,即13个字节;黄线部分是数据块类型码,按ASCII编码得到IHDR四个字符,代表文件头数据;而后蓝线部分是文件头数据块的width域,表示宽5像素;绿线部分是文件头数据块的height域,表示高5像素。
4.2 调色板数据块
调色板数据块的数据块类型码为PLTE,它包含有与索引彩色图像相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前。真彩色的PNG数据流也可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。调色板数据块结构如表3。
域的名称 | 字节数 | 说明 |
Red | 1 byte | 0 = 黑,255 = 红 |
Green | 1 byte | 0 = 黑,255 = 绿 |
Blue | 1 byte | 0 = 黑,255 = 蓝 |
调色板数据块并非一定有的,样例图片中就没有包含调色板数据块。
4.3 图像数据块
图像数据块的数据块类型码是IDAT,存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。这里的数据都是经过压缩算法输出的数据。
样例图像中仅有一个图像数据块,在上图中用蓝色划出,可以看到49 44 41 54 对应的ASCII字符就是IDAT。
4.4 图像结束数据块
图像结束数据的数据块类型码是IEND,它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。
可以看到最后的数据块就是图像结束数据块,49 45 4E 44对应IEND字符。
4.5 辅助数据块
除了4个标准数据块外,PNG还有如下的辅助数据块,具有不同的作用。
- 透明信息数据块:tRNS chunk(Transparency chunk)
- 图像γ数据块:gAMA(Image gamma chunk)
- 基色和白色度数据块:cHRM(Primary chromaticities chunk)
- 标准RGB色彩空间数据块:sRGB(Standard RGB colour space chunk)
- 文本信息数据块:tEXt(Textual data chunk)
- 压缩文本数据块:zTXt Compressed textual data chunk)
- 背景颜色数据块:bKGD(Background colour chunk)
- 物理像素尺寸数据块:pHYs(Physical pixel dimensions chunk)
- 样本有效位数据块:sBIT(Significant bits chunk)
- 图像直方图数据块:hIST(Palette histogram chunk)
- 图像最后修改时间数据块:tIME(Image last-modification time chunk)
参考资料
PNG格式 - GameRes.comhttps://dev.gameres.com/Program/Visual/Other/PNGFormat.htm
PNG文件格式详解 - maxiongying - 博客园 (cnblogs.com)https://www.cnblogs.com/senior-engineer/p/9548347.htmlPNG文件的解析_szd小灰灰的博客-CSDN博客_png解析https://blog.csdn.net/weixin_46340912/article/details/107222105