PNG格式文件目前应用从21世纪初期就已较为广泛,当时J2ME的手机应用程序开发过程是可以使用PNG格式图片的,甚至于在有的手机上,开发过程仅兼容PNG格式的图片。
尽管使用图片可以为所开发的应用程序增加不少亮点,但是仅支持PNG格式的图片却又限制了我们进一步发挥的可能性。而在MIDP2,或者某些厂商(如NOKIA)提供的API中,提供了drawPixels/getPixels的方法,这些方法进一步提高了开发者处理图片的灵活性。然而,在MIDP2还未完全普及的时代,为了突破限制而提高开发的灵活性与便利性,对PNG格式媒体文件的必不可少[1]。
作者通过网络对PNG媒体文件进行了一定的学习,有了一定的了解。在本文中,作者则以多媒体文件的“容器”出发,针对PNG格式文件容器内的文件结构、数据组织结构、元数据信息等方面作简要的说明,并利用FlexHEX软件对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]。
相对GIF,PNG保留以下特性:
相对GIF文件,PNG也增加了以下特性:
PNG格式文件的总体文件结构为文件头与三个及以上的数据块(Chunk)组成(如下表)。其中文件头用于标识文件类型为PNG格式文件,从而指定编码格式;而数据块则含文件图像的所有信息。
PNG文件头 | PNG数据块 | …… | PNG数据块 |
---|
PNG格式文件的文件头是由位固定的字节进行描述,其大小占8个字节。其中第一个字节为0x89,以将其与文本文件进行区分。
十六进制文件头 | 89 50 4E 47 0D 0A 1A 0A |
---|---|
十进制文件头 | 137 80 78 71 13 10 26 10 |
将某PNG格式图片文件置于FlexHEX软件进行解析,得到文件数据,其中标志部分则为PNG格式文件的固定文件头(见下图)。
PNG格式图片的具体信息是由文件头后的数据块进行记录和表示。其中数据块的类型为两种,关键数据块(Critical Chunk)为文件的标准数据块,而辅助数据块(Ancillary Chunk)为文件中可选的数据块。
其中关键数据块定义了PNG格式文件的4种标准数据块(如下表所示),是PNG格式文件的必需数据块,同时PNG读写软件的编码和译码对象也即为关键数据块。
数据块类别 | 数据块名称 | 是否多数据块 | 是否可选 | 位置限制 |
---|---|---|---|---|
IHDR | 文件头数据块 | 否 | 否 | 第一块 |
PLTE | 调色板数据块 | 否 | 是 | 在IDAT之前 |
IDAT | 图像数据快 | 是 | 否 | 与其他IDAT连接 |
IEND | 图像结束数据 | 否 | 否 | 最后一块 |
关键数据块中,四种数据块分别包含PNG文件的不同类型信息。
可知,PNG格式图像文件的图像基本数据是以数据块为单位进行存储,其元数据即为编码后数据块内的一个或多个字节,分别携带文件特定信息或图像中特定像素的数据。
其中每个数据块由4个部分组成(如下表)。
名称 | 字节数 | 说明 |
---|---|---|
Length(长度) | 4 | 指定数据块中数据域的长度,其长度不超过(231-1)字节 |
Chunk Type Code(数据块类型码) | 4 | 数据块类型码由ASCII字母(A-Z和a-z)组成 |
Chunk Data (数据块数据) | 可变 | 存储按照Chunk Type Code指定的数据 |
CRC (循环冗余检测) | 4 | 存储用来检测是否有错误的循环冗余码 |
其中CRC循环检验码的生成多项式为:
x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
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。
调色板数据块PLTE包含有与索引彩色图像相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块之前。
PLTE数据块是定义图像的调色板信息,PLTE可以包含1-256个调色板信息,每一个调色板信息由3个字节组成,分别代表RGB颜色分量,且阈值为0-255。
利用FlexHEX软件,对PNG示例文件进行分析(如图4-2)。在可选数据段sRGB之后,为PLTE数据块的信息。由表中信息可知,IHDR数据块数据长度为39字节,表示文件中有13个颜色。
图像数据块IDAT为图像文件存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。
IDAT存放着图像真正的数据信息,因此,如果能够了解IDAT的结构,就可快速进行解码,生成PNG图像。
FlexHEX软件,对PNG示例文件进行分析(如图4-3)。其中为某一段长度为211字节的IDAT数据块。其中49 44 41 54即为IDAT数据块的标识符。
图像结束数据块IEND,用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。
大多数情况下,PNG文件的12字节IEND数据块为
00 00 00 00 49 45 4E 44 AE 42 60 82
利用FlexHEX软件,对PNG示例文件进行分析(如图4-4)。在文件结尾的12字节数据块,即为IEND数据块,且数据块内容与通常相同。
通过对PNG格式文件的文件结构、数据结构以及元数据表示方法的简要学习,作者对PNG媒体文件有了进一步的认识,同时也了解了PNG文件读取时内部数据的查看方法。同时,对于PNG格式的文件,在学习过程中已经对文件的数据组织形式、数据编码格式、数据存储方法等问题进行了解决,对简单多媒体文件的设计思想和理解过程有了进一步的认识。
[1] PNG文件结构分析
[2] PNG格式
[3] PNG文件格式详解
[4] PNG文件结构分析
[5] PNG文件结构最简单解析(生成)