1.png是一种采用无损压缩算法的位图格式,其设计目的是试图替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性;
2.PNG使用从LZ77派生的无损数据压缩算法,一般应用于JAVA程序、网页或S60程序中,原因是它压缩比高,生成文件体积小。
1.使用调色板技术可支持256种颜色的彩色图像。
2.流式读/写性(streamability):图像文件格式允许连续读出和写入图像数据。(因此适于网络传播)
3.逐次逼近显示(progressive display):这种特性可使在通信链路上传输图像文件的同时就在终端上显示图像,把整个轮廓显示出来之后逐步显示图像的细节,也就是先用低分辨率显示图像,然后逐步提高它的分辨率。(类似马赛克逐渐消除的过程)
4.透明性(transparency):这个性能可使图像中某些部分不显示出来,用来创建一些有特色的图像,JPEG和GIF没有这个特性
5.辅助信息(ancillary information):这个特性可用来在图像文件中存储一些文本注释信息。(就是可以说一些废话)
6.独立于计算机软硬件环境
7.使用无损压缩(无损!)
8.体积小,可在一个文件中存储多幅图像
8字节的PNG文件署名域用来识别该文件是不是PNG文件
| 十进制表示 | 十六进制表示 |
|---|---|
| 137 80 78 71 13 10 26 10 | 89 50 4E 47 0D 0A 1A 0A |
数据块分为两种类型,一是关键数据块(critical chunk),是必要的块;二是辅助数据块(ancillary chunks)。
每个数据块都由下表所示的的4个域组成
| 名称 | 长度(字节) | 作用 |
|---|---|---|
| Length(长度) | 4 | 指定数据块中数据域的长度,其长度不超过(231−1)字节 |
| Chunk Type Code(数据块类型码) | 4 | 数据块类型码由ASCII字母(A-Z和a-z)组成 |
| Chunk Data(数据块实际内容) | 可变长度 | 存储按照Chunk Type Code指定的数据 |
| CRC(循环冗余检测 ) | 4 | 存储用来检测是否有错误的循环冗余码 |
关键数据块中的4个标准数据块是:
- 文件头数据块IHDR(header chunk):
它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。 - 调色板数据块PLTE(palette chunk):
它包含有与索引彩色图像(indexed-color image)相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前。真彩色的PNG数据流也可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。结构如下:
| 颜色 | 长度(字节) | 含义 |
|---|---|---|
| Red | 1 | 0 = 黑,255 = 红 |
| Green | 1 | 0 = 黑,255 = 绿 |
| Blue | 1 | 0 = 黑,255 = 蓝 |
-
图像数据块IDAT(image data chunk):
它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。
IDAT存放着图像真正的数据信息,因此,如果能够了解IDAT的结构,我们就可以很方便的生成PNG图像。 -
图像结束数据IEND(image trailer chunk):
它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。
如果我们仔细观察PNG文件,我们会发现,文件的结尾12个字符看起来总应该是这样的:
00 00 00 00 49 45 4E 44 AE 42 60 82
解析如下:
| 字符 | 含义 |
|---|---|
| 00 00 00 00 | 数据块的长度总是0(除非人为加入信息) |
| 49 45 4E 44 | 数据标识 |
| AE 42 60 82 | CRC码 |
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)5 实例分析
使用visual studio,通过“文件/打开/文件”,选择打开方式为二进制编辑器
以十六进制表示的二进制文件数据流
8byte文件标识
在PNG文件中,每个数据块都由下面四部分组成,所以,每次只需要读取前8个字节,就可以大致判断出数据块的类型和长度
5.1 关键数据块分析
- IHDR(header chunk):包含有图像基本信息,作为第一个出现的数据块并且只出现一次;
- PLTE(palette chunk):调色板数据块,必须存放在图像数据块之前;
- IDAT(image data chunk):存储实际的图像数据。PNG数据包允许包含多个连续的图像数据块;
- IEND(image trailer chunk):图像结束数据,表示PNG数据流结束。
1.IHDR(文件头数据块),由13字节组成,格式如下图所示:
1)
0x0D表示长度,13字节,后面四字节表明该数据块是HIDR数据块
2)
图像宽度为0x298,即664像素;长度为0x1F2,即498像素。
3)(1)图像深度为8位
(2)颜色类型为0x02,即图像真彩色图像,8或16;
(3)压缩方法,滤波器方法,隔行扫描方法:0x00。
4)
循环冗余校验码CRC: C0 D4 29 3F
2.PLTE(调色版数据块)
本例没有调色板数据块
3.IDAT(图像数据块),存储实际的数据,在数据流中可包含多个连续顺序的图像数据块
4.IEND(图像结束数据),用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。
十六进制下表示为:00 00 00 00 49 45 4E 44 AE 42 60 82
pHYs(物理像素尺寸数据块),长度为0x09,CRC为00 9A 9C 18



