**
数据压缩作业——PNG图像文件格式分析
**
PNG简述
PNG 是可携式网络图像(portable network graphics)的英文缩写。兴起于网络,目的是替代 GIF 和 JPG 格式,其支持的图像颜色非常丰富,是当今常用的图像资源格式。
PNG图像类型
PNG图片主要有三个类型,分别为 PNG 8/ PNG 24 / PNG 32。
PNG 8:PNG 8中的8,其实指的是8bits(一个字节),相当于用2^8 (2的8次方)大小来存储一张图片的颜色种类,也就是说PNG 8能存储256种颜色。
PNG24:PNG 24中的24,相当于3乘以8 等于 24,就是用三个8bits分别去表示 R(红)、G(绿)、B(蓝)。R,G,B的取值分别从0~255。可以存储256^3=16777216种颜色。其相比于PNG 8的色彩更丰富,同时所占空间也更大。
PNG 32:PNG 32中的32,相当于PNG 24 加上 8bits的透明颜色通道,就相当于R(红)、G(绿)、B(蓝)、A(透明)。比PNG 24多了一个A(透明)。PNG 32能表示跟PNG 24一样多的色彩,并且还支持256种透明的颜色,能表示更加丰富的图片颜色类型。
PNG图像格式
PNG 文件由两部分组成,分别是 PNG 文件标志和数据块(chunks),数据块分为两类:关键数据块(critical chunk)和辅助数据块(ancillary chunks)。
关键数据块在 PNG 文件中是必须有的,而辅助数据块是可选的。
关键数据块
关键数据块(critical chunks)由 4 部分组成:文件头数据块(IHDR)、调色板数据块(PLTE)、图像数据块(IDAT)和图像结束数据(IEND)。
其中调色板数据块(PLTE)根据图像的色深可选。
辅助数据块
数据块名称 | 允许多个数据块 | 位置 |
---|---|---|
cHRM(基色和白色点数据块) | 不允许 | 在PLTE和IDAT之前 |
gAMA(图像γ数据块) | 允许 | 在PLTE和IDAT之前 |
iCCP(ICCP) | 不允许 | 在PLTE之后IDAT之前如果有iCCP,则无 sRGB |
sBIT(样本有效位数据块 | 不允许 | 在PLTE和IDAT之前 |
sRGB(标准RPG颜色) | 不允许 | 在PLTE之后IDAT之前 |
bKGD(背景颜色数据块) | 不允许 | 在PLTE之后IDAT之前 |
hIST(图像直方图数据块) | 不允许 | 在PLTE之后IDAT之前 |
tRNS(图像透明数据块) | 不允许 | 在PLTE之后IDAT之前 |
pHYs(物理像素尺寸数据块) | 不允许 | 不允许在IDAT之前 |
sPLT(建议调色板) | 允许 | 允许在IDAT之前 |
tIME(图像最后修改时间数据块) | 不允许 | 无限制 |
iTXt(国际文本数据) | 允许 | 无限制 |
tEXt(文本信息数据块) | 允许 | 无限制 |
zTXt(压缩文本数据块) | 允许 | 无限制 |
PNG图像案例分析
PNG 文件的数据块格式:
CRC 循环冗余码生成的计算方式是通过对 Chunk Type Code 和 Chunk Data 中的数据进行计算得到的,计算方式如下:
x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
使用visual studio的二进制编辑器打开一张PNG图片(选择“打开”中的“打开方式”)
读取PNG图片的二进制信息
首先其第一个数据块的8个字节为8950 4E47 0D0A 1A0A,说明是PNG类型的文件,其中 50 4E 47 对应的 ASCII值是"PNG"。
数据块分析
IHDR数据块
文件头数据块(IHDR)包含有 PNG 文件中存储的图像数据的基本信息。如图像的宽高、色深、颜色类型、压缩方式等。
一个 PNG 文件只能有一个文件头数据块
sRGB数据块
分析图像文件中的SRGB数据块中个字段的含义,sRGB的信息由一个字节组成:
本图像文件中的sRGB信息如下:
gAMA数据块
通常在sRGB的后面同时写入gAMA数据块(有时候也会有cHRM数据块),为了使得一些不能正确解码sRGB数据块的PNG解码器正确解码。跟在sRGB数据块后面的gAMA数据块和cHRM的正确写法应该如下表所示:
*[图片来源:11.3.3.5 sRGB Standard RGB colour space]
图像中gAMA数据块的结构分析:
pHYs数据块
物理像素尺寸数据块(pHYs)是指定像素大小或图像的宽和高的比例。
物理像素尺寸数据块(pHYs) 中各字段的含义:
图像中的物理像素尺寸数据块(pHYs)数据块的结构分析:
IDAT数据块
PNG 的图像数据块(IDAT)存储图像的实际数据,相当于 BMP 图像的图像数据。PNG 可以包含多幅图像,所以 PNG 的图像数据块可能是由一幅图像的数据组成,也可能是由多幅图像的数据组成。
图像中的图像数据块(IDAT)的结构分析:
IEND数据块
PNG 的图像结束数据(IEND)用来标记 PNG 文件结束,且**必须要放在文件的尾部**。
通常,PNG 图像结束数据(IEND)的十六进制数值都是一样的,如下:
00 00 00 00 49 45 4E 44 AE 42 60 82
图像文件中图像结束数据(IEND)结构分析:
参考文献
[1]: PNG 图像文件格式解析
[2]:PNG文件格式解析 https://blog.csdn.net/weixin_41926958/article/details/105163016
[3]: PNG图像文件格式解析_png格式解析,png解析-Web开发文档类资源-CSDN文库 https://download.csdn.net/download/foxtigermission/9874988
[4]: PNG、JPEG、BMP等几种图片格式详解(一)—— PNG - 简书 https://www.jianshu.com/p/4d8cace82028