1.PNG格式简介
Critical Chunk(关键数据块),有四种类型:
- IHDR,header chunk,包含有图像基本信息,作为第一个出现的数据块并且只出现一次。
- PLTE,palette chunk,调色板数据块,必须存放在图像数据块之前。
- IDAT,image data chunk,存储实际的图像数据。PNG数据包允许包含多个连续的图像数据块。
- IEND,image trailer chunk,图像结束数据,表示PNG数据流结束。
Ancillary Chunk(辅助数据块),类型众多,PNG文件格式规范制定了10个辅助数据块:
- 背景颜色数据块bKGD(background color)。
- 基色和白色度数据块cHRM(primary chromaticities and white point)。
- 图像γ数据块gAMA(image gamma)。
- 图像直方图数据块hIST(image histogram)。
- 物理像素尺寸数据块pHYs(physical pixel dimensions)。
- 样本有效位数据块sBIT(significant bits)。
- 文本信息数据块tEXt(textual data)。
- 图像最后修改时间数据块tIME (image last-modification time)。
- 图像透明数据块tRNS (transparency)。
- 压缩文本数据块zTXt (compressed textual data)。
关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们,PNG读写软件也都必须要支持这些数据块。虽然PNG文件规范没有要求PNG编译码器对可选数据块进行编码和译码,但规范提倡支持可选数据块。
除上述中的限制外,各类chunk的出现顺序没有严格要求。同时在文件中的数据是按照:高位在前低位在后的顺寻存储的,这一点和BMP格式并不一致。
2.PNG文件分析
下面以具体文件进行实例分析,如图(“嘿眉黑莓”)所示:
使用visual studio,通过“文件/打开/文件”,选择打开方式为二进制编辑器,得到以十六进制表示的二进制文件数据流。
FILEHEAD(头文件),由位固定的字节来描述的:
十进制表示 | 十六进制表示 |
---|---|
137 80 78 71 13 10 26 10 | 89 50 4E 47 0D 0A 1A 0A |
在PNG文件中,每个数据块都由下面四部分组成,所以,每次只需要读取前8个字节,就可以大致判断出数据块的类型和长度。
IHDR(文件头数据块),由13字节组成,格式如下图所示:
0x0D表示长度,13字节,后面四字节表明该数据块是HIDR数据块。
图像宽度为0x1222,即4642像素;长度为0xE28,即3624像素。
图像深度为8位;
颜色类型为0x06,即图像为带a通道数据的真彩色图像;
压缩方法,滤波器方法,隔行扫描方法:0x00。
循环校验码 CRC:3D 79 2E F3。
PLTE(调色版数据块),包含有与索引彩色图像相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块之前。PLTE可以包含1~256个调色板信息,每一个调色板信息由3个字节组成,因此,调色板的长度应该是3的倍数,否则,这将是一个非法的调色板。
本例是带有a通道数据的真彩色图像,没有调色板数据块。
IDAT(图像数据块),存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。
实际数据太多,故不一一列举。
IEND(图像结束数据),用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。
十六进制下表示为:00 00 00 00 49 45 4E 44 AE 42 60 82
辅助数据块的分析采用了链接内的方法,代码运行结果也如下:
PNG文件分析https://blog.csdn.net/Cross_Entropy/article/details/105179408
pHYs(物理像素尺寸数据块),长度为0x09,CRC为78 A5 3F 76。
cHRM(基色和白色度数据块),长度为0x20,CRC为92 5F C5 46。