PNG格式文件分析

  • Post author:
  • Post category:其他




PNG格式文件分析





概述

PNG格式文件目前应用从21世纪初期就已较为广泛,当时J2ME的手机应用程序开发过程是可以使用PNG格式图片的,甚至于在有的手机上,开发过程仅兼容PNG格式的图片。

尽管使用图片可以为所开发的应用程序增加不少亮点,但是仅支持PNG格式的图片却又限制了我们进一步发挥的可能性。而在MIDP2,或者某些厂商(如NOKIA)提供的API中,提供了drawPixels/getPixels的方法,这些方法进一步提高了开发者处理图片的灵活性。然而,在MIDP2还未完全普及的时代,为了突破限制而提高开发的灵活性与便利性,对PNG格式媒体文件的必不可少[1]。

作者通过网络对PNG媒体文件进行了一定的学习,有了一定的了解。在本文中,作者则以多媒体文件的“容器”出发,针对PNG格式文件容器内的文件结构、数据组织结构、元数据信息等方面作简要的说明,并利用FlexHEX软件对PNG格式文件(如下图)进行简要分析。

实践测试PNG格式图像




一、PNG格式文件



1、流式网络图形格式PNG

PNG即流式网络图形格式(Portable Network Graphic Format,简称PNG),其名称来源于非官方的解释术语“PNG’s Not GIF”,是一种位图文件(bitmap file)存储格式,读成“ping”。PNG格式是20世纪90年代中期开始开发的图像文件存储格式,其目的在于替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性。在此方式下用来存储灰度图像时,灰度图像的深度可多到16位,存储彩色图像时,彩色图像的深度可多到48位,并且还可存储多到16位的α通道数据。同时,PNG使用从LZ77派生的无损数据压缩算法[2]。



2、PNG文件特性

相对GIF,PNG保留以下特性:

  • 使用彩色查找表或者叫做调色板可支持256种颜色的彩色图像。
  • 流式读/写性能(streamability):图像文件格式允许连续读出和写入图像数据,这个特性很适合于在通信过程中生成和显示图像。
  • 逐次逼近显示(progressive display):这种特性可使在通信链路上传输图像文件的同时就在终端上显示图像,把整个轮廓显示出来之后逐步显示图像的细节,也就是先用低分辨率显示图像,然后逐步提高它的分辨率。
  • 透明性(transparency):这个性能可使图像中某些部分不显示出来,用来创建一些有特色的图像。
  • 辅助信息(ancillary information):这个特性可用来在图像文件中存储一些文本注释信息。
  • 独立于计算机软硬件环境。
  • 使用无损压缩。

相对GIF文件,PNG也增加了以下特性:

  • 每个像素为48位的真彩色图像。
  • 每个像素为16位的灰度图像。
  • 可为灰度图和真彩色图添加α通道。
  • 添加图像的γ信息。
  • 使用循环冗余码(cyclic redundancy code,CRC)检测损害的文件。
  • 加快图像显示的逐次逼近显示方式。
  • 标准的读/写工具包。
  • 可在一个文件中存储多幅图像。



二、文件结构

PNG格式文件的总体文件结构为文件头与三个及以上的数据块(Chunk)组成(如下表)。其中文件头用于标识文件类型为PNG格式文件,从而指定编码格式;而数据块则含文件图像的所有信息。

PNG文件头 PNG数据块 …… PNG数据块



1、PNG文件的文件头

PNG格式文件的文件头是由位固定的字节进行描述,其大小占8个字节。其中第一个字节为0x89,以将其与文本文件进行区分。

十六进制文件头 89 50 4E 47 0D 0A 1A 0A
十进制文件头 137 80 78 71 13 10 26 10

将某PNG格式图片文件置于FlexHEX软件进行解析,得到文件数据,其中标志部分则为PNG格式文件的固定文件头(见下图)。

FlexHEX软件下PNG格式文件的文件头



2、PNG文件的数据块

PNG格式图片的具体信息是由文件头后的数据块进行记录和表示。其中数据块的类型为两种,关键数据块(Critical Chunk)为文件的标准数据块,而辅助数据块(Ancillary Chunk)为文件中可选的数据块。

其中关键数据块定义了PNG格式文件的4种标准数据块(如下表所示),是PNG格式文件的必需数据块,同时PNG读写软件的编码和译码对象也即为关键数据块。

数据块类别 数据块名称 是否多数据块 是否可选 位置限制
IHDR 文件头数据块 第一块
PLTE 调色板数据块 在IDAT之前
IDAT 图像数据快 与其他IDAT连接
IEND 图像结束数据 最后一块

关键数据块中,四种数据块分别包含PNG文件的不同类型信息。

  • IHDR数据块包含图像的总描述信息,其信息包括图像宽度、高度,以及是否为彩色图像[3]。
  • PLTE数据块包含有与索引彩色图像相关的彩色变换数据,它仅与索引彩色图像有关。
  • IDAT数据块则包含呈现的图像数据,对于显示的PNG图像来说,IDAT为PNG读写软件的编解码主要对象。
  • IEND数据块则为PNG格式文件的文件尾终止符,表示文件的最后一个数据块。



三、PNG格式数据块结构

可知,PNG格式图像文件的图像基本数据是以数据块为单位进行存储,其元数据即为编码后数据块内的一个或多个字节,分别携带文件特定信息或图像中特定像素的数据。

其中每个数据块由4个部分组成(如下表)。

名称 字节数 说明
Length(长度) 4 指定数据块中数据域的长度,其长度不超过(231-1)字节
Chunk Type Code(数据块类型码) 4 数据块类型码由ASCII字母(A-Z和a-z)组成
Chunk Data (数据块数据) 可变 存储按照Chunk Type Code指定的数据
CRC (循环冗余检测) 4 存储用来检测是否有错误的循环冗余码

其中CRC循环检验码的生成多项式为:

x

32

+x

26

+x

23

+x

22

+x

16

+x

12

+x

11

+x

10

+x

8

+x

7

+x

5

+x

4

+x

2

+x+1



1、IHDR数据块

IHDR数据块即文件头数据块,包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中。同时,一个PNG数据流中只能有一个文件头数据块。

文件头数据块是由13字节组成,其中表示的元数据如下表所示。

名称 字节数 说明
Width 4 图像宽度,以像素为单位
Height 4 图像高度,以像素为单位
Bit Depth 1 图像深度
Color Type 1 颜色类型
Compression Method 1 压缩方法(LZ77派生算法)
Fitter Method 1 滤波器方法
Interlace Method 1 隔行扫描方法

其中图像深度数据:

  • 索引彩色图像:1,2,4或8
  • 灰度图像:1,2,4,8或16
  • 真彩色图像:8或16

颜色类型:

  • 0:灰度图像, 1,2,4,8或16
  • 2:真彩色图像,8或16
  • 3:索引彩色图像,1,2,4或8
  • 4:带α通道数据的灰度图像,8或16
  • 6:带α通道数据的真彩色图像,8或16

隔行扫描方法:

  • 0:非隔行扫描
  • 1: Adam7(由Adam M. Costello开发的7遍隔行扫描方法)

利用FlexHEX软件,对PNG示例文件进行分析(如图4-1),在文件头之后即为IHDR数据块的信息。由表中信息可知,IHDR数据块总长度为25字节,其中数据部分13个字节,地址则00000008 ~ 00000021。

实践操作IHDR数据块



2、PLTE数据块

调色板数据块PLTE包含有与索引彩色图像相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块之前。

PLTE数据块是定义图像的调色板信息,PLTE可以包含1-256个调色板信息,每一个调色板信息由3个字节组成,分别代表RGB颜色分量,且阈值为0-255。

利用FlexHEX软件,对PNG示例文件进行分析(如图4-2)。在可选数据段sRGB之后,为PLTE数据块的信息。由表中信息可知,IHDR数据块数据长度为39字节,表示文件中有13个颜色。

实践操作PLTE数据块



3、IDAT数据块

图像数据块IDAT为图像文件存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。

IDAT存放着图像真正的数据信息,因此,如果能够了解IDAT的结构,就可快速进行解码,生成PNG图像。

FlexHEX软件,对PNG示例文件进行分析(如图4-3)。其中为某一段长度为211字节的IDAT数据块。其中49 44 41 54即为IDAT数据块的标识符。

实践操作IDAT数据块



4、IEND数据块

图像结束数据块IEND,用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。

大多数情况下,PNG文件的12字节IEND数据块为

00 00 00 00 49 45 4E 44 AE 42 60 82

利用FlexHEX软件,对PNG示例文件进行分析(如图4-4)。在文件结尾的12字节数据块,即为IEND数据块,且数据块内容与通常相同。

实践操作IEND数据块




总结

通过对PNG格式文件的文件结构、数据结构以及元数据表示方法的简要学习,作者对PNG媒体文件有了进一步的认识,同时也了解了PNG文件读取时内部数据的查看方法。同时,对于PNG格式的文件,在学习过程中已经对文件的数据组织形式、数据编码格式、数据存储方法等问题进行了解决,对简单多媒体文件的设计思想和理解过程有了进一步的认识。




参考及引用材料

[1]

PNG文件结构分析


[2]

PNG格式


[3]

PNG文件格式详解


[4]

PNG文件结构分析


[5]

PNG文件结构最简单解析(生成)



版权声明:本文为weixin_48680270原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。