0
点赞
收藏
分享

微信扫一扫

PNG文件格式分析

witmy 2022-03-15 阅读 170

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 1089 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文件分析icon-default.png?t=M276https://blog.csdn.net/Cross_Entropy/article/details/105179408

 pHYs(物理像素尺寸数据块),长度为0x09,CRC为78 A5 3F 76。 

cHRM(基色和白色度数据块),长度为0x20,CRC为92 5F C5 46。 

举报

相关推荐

0 条评论