png图片文件的数据结构
2018-01-26 19:56阅读:
png图片文件的数据结构
PNG是20世纪90年代中期开始开发的图像文件存储格式,现在已经开始流行,并在安卓手机上得到了广泛的运用,所以,我们应该对它的数据结构有所了解。
一、数据结构
1.PNG数据块
PNG定义了两种类型的数据块,一种是称为关键数据块,这是标准的数据块,另一种叫做辅助数据块,这是可选的数据块。关键数据块定义了5个标准数据块,每个PNG文件都必须包含它们,PNG读写软件也必须要支持这些数据块。至于可选数据块,规范只是提倡予以支持。
表1就是PNG中数据块的类别,其中*号表示关键数据块:
表1:PNG数据块的类别
--------------------------------------------------------------------
数据块符号 数据块名称
多数据块 位置限制
--------------------------------------------------------------------
* PNG文件标识
第一块
IHDR * 文件头数据块
否
第二块
cHRM
基色和白色点数据块
否
在PLTE和IDAT之前
gAMA
图像γ数据块
否
在PLTE和IDAT之前
sBIT
样本有效位数据块
否
在PLTE和IDAT之前
PLTE *
调色板数据块
否
在IDAT之前
bKGD 背景颜色数据块
否在PLTE之后IDAT之前
hIST
图像直方图数据块
否
在PLTE之后IDAT之前
tRNS
图像透明数据块
否
在PLTE之后IDAT之前
oFFs
(专用公共数据块)
否
在IDAT之前
pHYs
物理像素尺寸数据块
否
在IDAT之前
sCAL
(专用公共数据块)
否
在IDAT之前
IDAT
*
图像数据块
是
与其他IDAT连续
tIME
图像最后修改时间
否
无限制
tEXt
文本信息数据块
是
无限制
zTXt
压缩文本数据块
是
无限制
fRAc
(专用公共数据块)
是
无限制
gIFg
(专用公共数据块)
是
无限制
gIFt
(专用公共数据块)
是
无限制
gIFx
(专用公共数据块)
是
无限制
IEND
*
图像结束数据块
否
最后一块
------------------------------------------------------------------
说明:
①除了关键数据块,其它的数据块都是可有可无的。
2.数据块结构
PNG文件中,除了PNG文件标识外,所有的数据块均由4个部分组成,如表2。
表2:数据块的组成
--------------------------------------------------------------------------
顺号
名称
字节数
说明
--------------------------------------------------------------------------
1 长度
4
指定第3部分数据域的长度
2 数据块符号
4
由数据块符号的
Ascii
码组成
3 数据域
不定
存储按照
Chunk
Type
Code
指定的数据
4 CRC校验
4
又称循环冗余检测,用来检测是否有错误
--------------------------------------------------------------------------
说明:
①循环冗余检测中的值是对第2部分数据块符号和第3部分数据域进行计算得到的,我们只要知道有这么回事就行了。
3.5个关键数据块的具体结构
⑴PNG文件标识
它固定为8个字节:89 50 4E 47 0D 0A 1A
0A,前4个字节为“.PNG”的Ascii码。
⑵文件头数据块
它包含有PNG文件中存储的图像数据的基本信息,并要作为第二个数据块出现在PNG数据流中,一个PNG数据流中只能有一个文件头数据块。格式如表3所示。
表3:文件头数据块结构
------------------------------------------------------------
域名称
字节数
说明
------------------------------------------------------------
数据域长度
4
指定数据域的长度,固定为00 00 00 0D
数据块符号
4
49 48 44
52,是“IHDR”的Ascii码
(以下13个字节是数据域)
图像宽度
4
单位:像素
图像高度
4
单位:像素
颜色深度
1
见说明①
颜色类型
1
见说明②
压缩方法
1
规定此字节为0(使用LZ77派生算法压缩)
滤波器方法
1
通常此字节为0
隔行扫描方法
1
0=非隔行扫描,1=Adam7(7遍隔行扫描方法)
CRC校验
4
------------------------------------------------------------
说明:
①不同色彩的颜色深度值
灰度图像:1、2、4、8或16
真彩色图像:8或16
索引彩色图像:1、2、4或8
带α通道数据的灰度图像:8或16
带α通道数据的真彩图像:8或16
②不同色彩的颜色类型值
灰度图像:0
真彩色图像:2
索引彩色图像:3
带α通道数据的灰度图像:4
带α通道数据的真彩色图像:6
⑶调色板数据块
包含有与索引彩色图像相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块之前。它定义图像的调色板信息,其数据结构如表4。
表4:调色板数据结构
--------------------------------------------------------------------------------
域名称
字节数
说明
--------------------------------------------------------------------------------
数据域长度
4
指定数据域的长度
数据块符号
4
50 4C 54
45,是“PLTE”的Ascii码
数据域
不定
有n个调色板,就有3×n个字节长度,最多3×256字节
CRC校验
4
---------------------------------------------------------------------------------
说明:
①每一个调色板由表示红、绿、蓝信息的3个字节组成,因此,调色板的长度应该是3的整倍数,否则就是非法的调色板。
②对于索引图像,调色板信息是必须的,调色板的颜色索引从0开始编号,然后是1、2……,调色板的颜色数不能超过文件头数据块中“颜色深度”规定的颜色数(例如图像色深为4时,调色板中的颜色数不可超过2^4=16),否则将导致PNG图像不合法。
③真彩色图像和带α通道数据的真彩色图像可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像,也可以不要调色板。
⑷图像数据块
它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。其数据结构见表5。
表5:图像数据块的数据结构
-------------------------------------------------------------
域名称
字节数
说明
-------------------------------------------------------------
数据域长度
4
指定数据域的长度
数据块符号
4
49 44 41 54,是“IDAT”的Ascii码
数据域
不定
存放着图像真正的数据信息(压缩的)
CRC校验
4
-------------------------------------------------------------
说明:
①由于图像数据域是压缩数据,如果你能够掌握压缩和解压缩的方法,那么你就能轻易而举地将其它类型的图片转换成PNG图片,或者将PNG图片转换成其它类型的图片。
⑸图像结束块
它用来标记PNG文件或者数据流已经结束,必须要放在文件的尾部。其数据结构如表6。
表6:图像结束块的数据结构
-------------------------------------------------------------
域名称
字节数
说明
-------------------------------------------------------------
数据域长度
4
00 00 00
00
数据块符号
4
49 45 4E
44,是“IEND”的Ascii码
CRC校验
4
AE 42 60 82
-------------------------------------------------------------
说明:
①图像结束块的12个字节值是固定的。
二、一个具体的例子
用系统画图新建一个8×8像素的图像,填充红色,另存为PNG图片,该图片全部数据如下(注:因设备差异,你的数据也许会有微小不同):
-----------------------------------------------------------------
0000: 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
0010: 00 00 00 08 00 00 00 08 08 02 00 00 00 4B 6D 29
0020: DC 00 00 00 01 73 52 47 42 00 AE CE 1C E9 00 00
0030: 00 04 67 41 4D 41 00 00 B1 8F 0B FC 61 05 00 00
0040: 00 20 63 48 52 4D 00 00 7A 26 00 00 80 84 00 00
0050: FA 00 00 00 80 E8 00 00 75 30 00 00 EA 60 00 00
0060: 3A 98 00 00 17 70 9C BA 51 3C 00 00 00 17 49 44
0070: 41 54 18 57 63 FC CF 80 03 00 25 B0 22 EC A2 20
0080: 63 06 52 07 00 11 99 38 C9 DB F8 06 FD 00 00 00
0090: 00 49 45 4E 44 AE 42 60 82
------------------------------------------------------------------
1.分析:
0000-0007:这8个字节为PNG文件标识。
0008-0020:文件头数据块,其中:
00 00 00 0D:数据域长度为13字节
49 48 44 52:文件头数据块符号“IHDR”
00 00 00 08:图像宽8像素
00 00 00 08:图像高8像素
08:24位颜色深度
02:颜色类型为真彩
00:使用压缩
00:滤波器方法,通常为0
00:非隔行扫描
4B 6D 29 DC:CRC校验码
0021-002D:可选数据块 sRGB
002E-003D:可选数据块 gAMA(图像γ数据块)
003E-0069:可选数据块 cHRM(基色和白色点数据块)
006A-008C:IDAT数据块,其中:
00 00 00 17:数据域长度为23字节
49 44 41 54:IDAT数据块符号“IDAT”
18 57 63… :压缩的数据
DB F8 06 FD:CRC校验码
008D-0098:IEND数据块,如上所说,固定为00 00 00 00 49 45 4E 44 AE 42 60 82
2.实验
由于PNG中规定除关键数据块外,其它的辅助数据块都为可选的,因此,我们可以用Hex编辑器来对这些数据做增删试验(王牌Hex编辑器下载地址:
vb62013@163.com,密码:vb620132013)。
①为图片减肥
利用Hex编辑器的删除功能,删除0021-0069这3个辅助数据块,文件字节数由原来的153字节缩减到80字节,而并不影响图像的内容!试试看,你成功了吗?
但要注意的是,PNG格式可以保存图像中的层、文字等信息,一旦删除了这些数据后,图像将失去原来的可编辑性。
②添加文本信息
在原图像中增加这么一个字符串“PNG图片”,字符串的Ascii码是50 4E 47
CD BC C6 AC,共7个字节,所以数据域长度应为00 00 00 07,数据块符号是“tEXt”,Ascii码是74 45 58
74,至于CRC校验码,我们随便写4个字节,就写BA 2D 29 CC吧!这些信息全合起来就是:
00 00 00 07 74 45 58 74 50 4E 47 CD BC C6
AC BA 2D 29 CC
共19字节。由于tEXt数据块可以出现在任意数据块之间,我们就利用Hex编辑器的插入功能把这19个字节从cHRM块后面插入吧,然后另存为,再用附件中的代码打开它,我们就不仅可以看到图像,还可以看到这个字符串文本了!
三、附件
由于本文无法带附件,所以请到下载王牌Hex编辑器的163信箱去下载《显示png图片的代码》邮件。
附件中的类模块不是笔者的原创,笔者只是进行了大规模的删除以及添加注释又增加了放大或缩小的功能。类模块中对辅助数据块的处理笔者只保留了文本信息部分,其它的统统删除了。