PNG格式的数据结构

时间:2024-04-05 12:02:03

一、什么是PNG格式?

PNG是便携式网络图形的英文缩写,是一种常用的图片格式,其特点是压缩比高、体积小,并且是无损压缩,支持透明效果,支持真彩和灰度级图像的Alpha通道透明度,最高支持24位真彩色图像以及8位灰度图像。除此之外,PNG支持文件的流式读/写。

二、PNG格式的文件结构

PNG图像格式文件(或者称为数据流)由一个8字节的PNG文件署名(PNG file signature)和按照特定结构组织的3个以上的数据块(chunk)组成。

PNG定义了两种类型的数据块,一种是称为关键数据块(critical chunk),这是必需的数据块,另一种叫做辅助数据块(ancillary chunks),这是可选的数据块。关键数据块定义了4个标准数据块,分别为IHDR(文件头数据块)PLTE( 调色板数据块)IDAT(图像数据块)IEND(图像结束数据)。每个PNG文件都必须包含它们,PNG读写软件也都必须要支持这些数据块。虽然PNG文件规范没有要求PNG编译码器对可选数据块进行编码和译码,但规范提倡支持可选数据块。

三、数据块(chunk)的结构

PNG的每一个数据块又可分为四个域,分别为长度、类型、数据域、循环冗余检测。

长度:显示数据字段的长度信息,为4字节无符号整数,故数据长度限制在(2^31-1)字节。

类型:为4字节数据块类型码,为了便于描述和检查PNG文件,类型代码仅限于大写和小写的ASCII字母。

数据域:存储按照数据块类型码指定的数据, 该字段可以是长度为零。

循环冗余检测:一个4字节的CRC(循环冗余校验)计算,在所述块的前面的字节,包括该块类型的代码和数据块的数据字段,但是不包括长度字段。 CRC始终存在,即使不包含数据块。

以一幅png图像为例,用二进制查看器打开,具体分析其数据块结构。

PNG格式的数据结构
得到的二进制数据:

PNG格式的数据结构

文件头数据块(IHDR)
png文件的前8个字节为固定的文件头信息,表明为png文件,其后便为IHDR。
IHDR的前1-4字节表示IHDR的长度(00 00 00 0D),可知长度为13。5-8字节(49 48 44 52)为数据块类型码,表明数据块为IHDR。9-16字节存储了图像的宽高信息(00 00 20 00 00 00 20 00),可知图片的宽高为512x512。其后的5个字节分别表示了图像的色深、颜色类型、滤波器方法、隔行扫描方法,最后四个字节为CRC循环冗余检测。

PNG格式的数据结构

调色板数据块(PLTE)

调色板数据块的色彩存储格式为RGB(各1byte),是一个彩色索引查找表,每个表项为3字节。而图片的数据块里的像素直接存储调色板里的索引值,根据索引寻找对应的颜色及透明色。在IHDR中可得知图片为带α通道的真彩色图像,故没有调色板数据块。

图像数据块IDAT

在PLTE之后便为图像数据块,存储图像的具体数据。

图像结束数据IEND

固定12个字节放在数据流的末尾,标志着图像的结束。

PNG格式的数据结构

四、其他辅助数据块

PNG文件规范制定了10个辅助数据块:

1、背景颜色数据块bKGD
2、基色和白色度数据块cHRM
3、图像γ数据块gAMA
4、图像直方图数据块hIST
5、物理像素尺寸数据块pHYs
6、样本有效位数据块sBIT
7、文本信息数据块tEXt
8、图像最后修改时间数据块tIME
9、图像透明数据块tRNS
10、压缩文本数据块zTXt