概述
流式网络图形格式(Portable Network Graphic Format,PNG)是一种位图文件(bitmap file)存储格式。PNG用来存储灰度图像时,灰度图像的深度可多到16位,存储彩色图像时,彩色图像的深度可多到48位,并且还可存储多到16位的α通道数据。
文件结构
PNG文件由文件署名域(8字节)和最少3个数据块(Chunk)按照特定的顺序排列而成。
数据块分为两类:
关键数据块(Critical Chunk):必须包含的数据块。
辅助数据块(Ancillary Chunk):可选的数据块。
文件署名域
8字节的PNG文件署名域用来识别该文件是不是PNG文件。该域的值:
- 十进制数
137 80 78 71 13 10 26 10
- 十六进制数
89 50 4E 47 0D 0A 1A 0A
在UltraEdit软件中打开.png图片
数据块结构
PNG定义了两种类型的数据块,一种是称为关键数据块(critical chunk)
,这是必需的数据块,另一种叫做辅助数据块(ancillary chunks)
,这是可选的数据块。关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们,PNG读写软件也都必须要支持这些数据块。虽然PNG文件规范没有要求PNG编译码器对可选数据块进行编码和译码,但规范提倡支持可选数据块。
数据块的4个域组成:
名称 | 字节数 | 说明 |
Length (长度) | 4字节 | 指定数据块中数据域的长度,其长度不超过(231-1)字节 |
Chunk Type Code (数据块类型码) | 4字节 | 数据块类型码由ASCII字母(A-Z和a-z)组成 |
Chunk Data (数据块数据) | 可变长度 | 存储按照Chunk Type Code指定的数据 |
CRC (循环冗余检测) | 4字节 | 存储用来检测是否有错误的循环冗余码 |
- 长度:一个4字节的无符号整数,给出数据块的数据字段的长度(以字节计)。 长度只计算数据域,为了兼容一些不支持无符号的语言,所以长度限制在(231 - 1)字节,不能达到(232 - 1)字节。
- 数据块类型码:一个4字节的块类型代码。 为了便于描述和检查PNG文件,类型代码仅限于大写和小写的ASCII字母(A - Z和a - z,使用十进制ASCII代码表示为65-90和97-122)。 然而,编码器和解码器必须把代码作为固定的二进制值而非字符串来处理。
- 数据域:数据块的数据域,存储按照数据块类型码指定的数据(如果有的话)。 该字段可以是长度为零。
- 循环冗余检测:一个4字节的CRC(循环冗余校验)计算,在所述块的前面的字节,包括该块类型的代码和数据块的数据字段,但是不包括长度字段。 CRC始终存在,即使不包含数据块。
CRC(cyclic redundancy check)
域中的值是对Chunk Type Code
域和Chunk Data
域中的数据进行计算得到的。
关键数据块
IHDR
:文件头数据块IHDR(header chunk)
:它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。
域的名称 | 字节数 | 说明 |
Width | 4 bytes | 图像宽度,以像素为单位 |
Height | 4 bytes | 图像高度,以像素为单位 |
Bit depth | 1 byte | 图像深度: |
ColorType | 1 byte | 颜色类型: |
Compression method | 1 byte | 压缩方法(LZ77派生算法) |
Filter method | 1 byte | 滤波器方法 |
Interlace method | 1 byte | 隔行扫描方法: |
红框:第一个数据块的数据域长度,即13个字节
黄框:数据块类型码,按ASCII编码得到IHDR四个字符,代表文件头数据
蓝框:文件头数据块的width域,图像宽度
绿框:文件头数据块的height域,图像高度
PLTE
:调色板数据块PLTE(palette chunk)
包含有与索引彩色图像(indexed-color image)
相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)
之前。PLTE数据块是定义图像的调色板信息,PLTE可以包含1~256个调色板信息,每一个调色板信息由3个字节组成。
颜色 | 字节 | 意义 |
Red | 1 byte | 0 = 黑色, 255 = 红 |
Green | 1 byte | 0 = 黑色, 255 = 绿色 |
Blue | 1 byte | 0 = 黑色, 255 = 蓝色 |
IDAT
:图像数据块IDAT(image data chunk)
:它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。IDAT存放着图像真正的数据信息,因此,如果能够了解IDAT的结构,我们就可以很方便的生成PNG图像。IEND
:图像结束数据IEND(image trailer chunk)
:它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。如果我们仔细观察PNG文件,我们会发现,文件的结尾12个字符看起来总应该是这样的:0000000049454E44AE426082
,由于数据块结构的定义,IEND数据块的长度总是0(00 00 00 00
,除非人为加入信息),数据标识总是IEND(49 45 4E 44)
,因此,CRC码也总是AE 42 60 82
。
辅助数据块
透明信息数据块: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)
参考资料
https://blog.csdn.net/weixin_46340912/article/details/107222105