数据压缩_任务四_PNG文件格式详解
文章目录
PNG文件格式详解
PNG是20世纪90年代中期开始开发的图像文件存储格式,其目的是企图替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性。PNG用来存储灰度图像时,灰度图像的深度可多到16位,存储彩色图像时,彩色图像的深度可多到48位,并且还可存储多到16位的α通道数据。PNG使用从LZ77派生的无损数据压缩算法。
一、图像中数据如何组织
PNG数据块(Chunk)
PNG图像格式文件(或者称为数据流)由一个8字节的PNG文件署名(PNG file signature)域和按照特定结构组织的3个以上的数据块(chunk)组成。
PNG定义了两种类型的数据块,一种是称为关键数据块(critical chunk),这是标准的数据块,另一种叫做辅助数据块(ancillary chunks),这是可选的数据块。关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们,PNG读写软件也都必须要支持这些数据块。
每个数据块由四部分组成,如下:
名称 | 字节数 | 说明 |
---|---|---|
Length(长度) | 4字节 | 指定数据块中数据域的长度,其长度不超过(231-1 ) |
Chunk Type Code(数据块类型) | 4字节 | 数据块类型码由ASCII字母(A-Z和a-z)组成 |
Chunk Data(数据块数据) | 可变长度 | 存储按照Chunk Type Code指定的数据 |
CRC(循环冗余检测) | 4字节 | 存储用来检测是否有错误的循环冗余码 |
二、如何识别PNG文件
文件署名域
PNG文件开头用8个字节作为文件署名域,用来识别该文件是不是PNG文件。该域的值为 89 50 4E 47 0D 0A 1A 0A。其中第一个字节0x89超出了ASCII字符的范围,这是为了避免某些软件在打开PNG文件时误将文件当做文本文件来处理。
三、如何获得图像元数据信息
文件头数据块IHDR(Header Chunk)
紧跟在文件署名域后的是文件头数据块IHDR,它包含有PNG文件中存储图像的基本信息,一个PNG数据流中只能有一个文件头数据块。文件头数据块中可变长度的Chunk Data(数据块数据)结构如下:
域的名称 | 字节数 | 说明 |
---|---|---|
Width | 4字节 | 图像宽度,以像素为单位 |
Height | 4字节 | 图像高度,以像素为单位 |
Bit depth | 1字节 | 图像深度: 索引彩色图像:1,2,4或8 灰度图像:1,2,4,8或16 真彩色图像:8或16 |
ColorType | 1字节 | 颜色类型: 0:灰度图像, 1,2,4,8或16 2:真彩色图像,8或16 3:索引彩色图像,1,2,4或8 4:带α通道数据的灰度图像,8或16 6:带α通道数据的真彩色图像,8或16 |
Compression method | 1字节 | 压缩方法(LZ77派生算法) |
Filter method | 1字节 | 滤波器方法 |
Interlace method | 1字节 | 隔行扫描方法: 0:非隔行扫描 1: Adam7(由Adam M. Costello开发的7 遍隔行扫描方法) |
以下图为例(PNG格式)
由图中数据可得:
-
Length:0x0D(13)——与IHDR数据域长度13相符;
-
Chunk Type Code:49 48 44 52(IHDR);
-
Width:0x3C(60);Height:0x38(56);
-
Bit depth:0x08(8 bit);
-
ColorType:0x06(6)——带α通道数据的真彩色图像(针对此图片,不带调色板);
-
Compression method :0x00——PNG Spec规定此处总为0(非0值为将来使用更好的压缩方法预留),表示使用压缩方法(LZ77派生算法);
-
Filter method:0x00——同上;
-
Interlace method:0x00(0)——非隔行扫描;
-
CRC:A1 6D 9B 64;
四、如何显示图像颜色
1、调色板数据块PLTE(Palette Chunk)
无论是非真彩色PNG数据流还是真彩色PNG数据流,都可以有调色板数据块。真彩色PNG数据流中调色板数据块的目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。
PLTE数据块是定义图像的调色板信息,PLTE可以包含1~256个调色板信息,每一个调色板信息由三个字节组成,因此调色板数据块所包含的最大字节数为256*3=768。
调色板数据块具体信息如下:
颜色 | 字节 | 意义 |
---|---|---|
Red | 1字节 | 0=黑色,255=红色 |
Green | 1字节 | 0=黑色,255=绿色 |
Blue | 1字节 | 0=黑色,255=蓝色 |
- 调色板的长度应该是3的倍数,否则非法;
- 调色板的颜色数不能超过色深中规定的颜色数否则非法;
以下图为例(PNG 图像深度1bit):
图中标蓝部分为调色板数据块PLTE
- 0x00 00 00 06:数据块中数据域长度为6字节(21*3);
- 0x50 4C 54 45:数据块类型码;
- 0x46 3d 37 0x81 6F 86:调色板数据;
- 0x4E 62 CC 5B: 循环冗余检测。
尝试修改调色板数据得到:
2、sRGB (Standard RGB colour space)
除了使用调色板数据块,PNG文件中还可以使用sRGB进行颜色识别和颜色管理。
如果存在sRGB块,则图像样本符合sRGB色彩空间[IEC 61966-2-1]。为了与不使用sRGB块的解码器兼容,标准中建议写入sRGB块的PNG编码器还写入gAMA块(以及可选的cHRM块)。当存在sRGB块时,建议识别它并能够进行颜色管理的解码器忽略gAMA和cHRM块,而改用sRGB块。
五、如何表示透明度
tRNS
解码器在文件数据中搜索tRNS字段,若文件ColorType=3且包含tRNS字段或ColorType=6,则该图像包含透明度信息。
若图像为带α通道的真彩色图片,直接从IDAT中每个像素数据中提取R、G、B、α分量值;
若图像为带索引图像,tRNS数据块中包含了一系列与调色板数据块对应的1字节α分量。Alpha值与8位全Alpha通道的解释相同:0为完全透明,255为完全不透明,与图像位深无关。 tRNS块所包含的alpha值不得超过调色板条目,但是tRNS块所包含的值可能少于调色板条目。在这种情况下,假定所有其余调色板条目的alpha值为255。
六、如何存储实际数据
图像数据块IDAT(Image Data Chunk)
存储实际数据,必须与其他IDAT连续。
七、如何标志图像结束
图像结束数据块(Image Data Chunk)
用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。当IEND数据块被找到时,这个PNG图像才认为是合法的PNG图像。
参考文献:https://www.w3.org/TR/PNG/