PNG图片格式
PNG(Portable Network Graphics) 是一种光栅化的,无损压缩的图片文件格式。其设计的目的是替换GIF,是目前网络中用得最广的无损压缩图片格式。我们可以用工具将前面的Bitmap转换为PNG。
下面是从上一章所说的 BMP转换过来的png_4x2_32bit.png的PNG图片,图片比较小,看仔细了:
- 体积小
网络通讯中因受带宽制约,在保证图片清晰、逼真的前提下,网页中不可能大范围的使用文件较大的bmp格式文件。 - 无损压缩 PNG文件采用LZ77算法的派生算法进行压缩,其结果是获得高的压缩比,不损失数据。它利用特殊的编码方法标记重复出现的数据,因而对图像的颜色没有影响,也不可能产生颜色的损失,这样就可以重复保存而不降低图像质量。
- 索引彩色模式
PNG-8格式与GIF图像类似,同样采用8位调色板将RGB彩色图像转换为索引彩色图像。图像中保存的不再是各个像素的彩色信息,而是从图像中挑选出来的具有代表性的颜色编号,每一编号对应一种颜色,图像的数据量也因此减少,这对彩色图像的传播非常有利。 - 更优化的网络传输显示
PNG图像在浏览器上采用流式浏览,即使经过交错处理的图像会在完全下载之前提供浏览者一个基本的图像内容,然后再逐渐清晰起来。它允许连续读出和写入图像数据,这个特性很适合于在通信过程中显示和生成图像。 - 支持透明效果
PNG可以为原图像定义256个透明层次,使得彩色图像的边缘能与任何背景平滑地融合,从而彻底地消除锯齿边缘。这种功能是GIF和JPEG没有的。 - PNG同时还支持真彩和灰度级图像的Alpha通道透明度。
- 最高支持24位真彩色图像以及8位灰度图像。
- 支持Alpha通道的透明/半透明特性。
- 支持图像亮度的Gamma校准信息。
- 支持存储附加文本信息,以保留图像名称、作者、版权、创作时间、注释等信息。
- 渐近显示和流式读写,适合在网络传输中快速显示预览效果后再展示全貌。
- 使用CRC防止文件出错。
- 最新的PNG标准允许在一个文件内存储多幅图像。
PNG文件结构
PNG图像格式文件(或者称为数据流)由一个8字节的PNG文件署名(PNG file signature)域和按照特定结构组织的3个以上的数据块(chunk)组成。
我们以二进制的形式将PNG图png_4x2_32bit.png打开:
00000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR
00000010: 0000 0004 0000 0002 0806 0000 007f a87d ...............}
00000020: 6300 0000 0173 5247 4200 aece 1ce9 0000 c....sRGB.......
00000030: 0004 6741 4d41 0000 b18f 0bfc 6105 0000 ..gAMA......a...
00000040: 0009 7048 5973 0000 0ec3 0000 0ec3 01c7 ..pHYs..........
00000050: 6fa8 6400 0000 1849 4441 5418 5763 0082 o.d....IDAT.Wc..
00000060: ffff 8118 4c81 2110 8029 b0e0 ffff 0005 ....L.!..)......
00000070: 2b10 f0fa b027 6800 0000 0049 454e 44ae +....'h....IEND.
00000080: 4260 82 B`.
- 文件头
PNG文件包含8字节的签名:
8950 4e47 0d0a 1a0a
值Value | 作用Purpose |
---|---|
89 |
超出了ASCII字符的范围,避免某些软件将图片当着文本来处理 |
50 4E 47 |
‘PNG’的ASCII值,PNG文件的标识 |
0D 0A |
Dos风格的的回车,检测DOS-Unix行结束数据的转换 |
1A |
Dos风格的换行符号 |
0A |
Unix风格的回车 |
- 数据块
PNG文件中包含3个以上的数据块,数据块间以特定的顺序组成。而数据块又分为关键数据块和辅助数据块。基本每个数据块都用下面的结构描述:
名称 | 字节数 | 说明 |
---|---|---|
Length (长度) | 4字节 | 指定数据块中数据域的长度,其长度不超过(231-1)字节 |
Chunk Type Code (数据块类型码) | 4字节 | 数据块类型码由ASCII字母(A-Z和a-z)组成 |
Chunk Data (数据块数据) | 可变长度 | 存储按照Chunk Type Code指定的数据 |
CRC (循环冗余检测) | 4字节 | 存储用来检测是否有错误的循环冗余码 |
- 关键数据块包括
数据块符号 | 数据块名称 | 多数据块 | 可选否 | 位置限制 |
---|---|---|---|---|
IHDR | 文件头数据块 | 否 | 否 | 第一块 |
IDAT | 图像数据块 | 是 | 否 | 与其他IDAT连续 |
IEND | 图像结束数据 | 否 | 否 | 最后一个数据块 |
和Bitmap相比,关键数据块多了一个IEND块。
- IHDR数据块
IHDR也称为文件头数据块,它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流(文件)中只能有一个文件头数据块。
IHDR文件头数据块由13字节组成
00000000: ---- ---- ---- ---- 0000 000d 4948 4452 .PNG........IHDR
00000010: 0000 0004 0000 0002 0806 0000 007f a87d ...............}
00000020: 63-- ---- ---- ---- ---- ---- ---- ---- c....sRGB.......
它的格式如下表所示:
offset | 值 Value | 域的名称 | 字节数 | 说明 |
---|---|---|---|---|
0000 000d |
13 | size | 4 | 数据块大小 |
4948 4452 |
IHDR |
type | IHDR的ASCII | 数据块的类型 |
0000 0004 |
4 | Width | 4 bytes | 图像宽度,以像素为单位 |
0000 0002 |
2 | Height | 4 bytes | 图像高度,以像素为单位 |
08 |
8 | Bit depth | 1 byte | 图像深度: 索引彩色图像:1,2,4或8 灰度图像:1,2,4,8或16 真彩色图像:8或16 |
06 |
6 | ColorType | 1 byte | 颜色类型: 0:灰度图像, 1,2,4,8或16 2:真彩色图像,8或16 3:索引彩色图像,1,2,4或8 4:带α通道数据的灰度图像,8或16 6:带α通道数据的真彩色图像,8或16 |
00 |
0 | Compression method | 1 byte | 压缩方法(LZ77派生算法) |
00 |
0 | Filter method | 1 byte | 滤波器方法 |
00 |
0 | Interlace method | 1 byte | 隔行扫描方法: 0:非隔行扫描 1: Adam7(由Adam M. Costello开发的7遍隔行扫描方法) |
7fa8 7d63 |
CRC | 4 | CRC校验码 |
按照我们的文件来~
- sRGB数据块
00000020: --00 0000 0173 5247 4200 aece 1ce9 ---- c....sRGB.......
offset | 值 Value | 域的名称 | 字节数 | 说明 |
---|---|---|---|---|
00 0000 01 |
1 | size | 4 | 数据块大小 |
73 5247 42 |
sRGB |
type | sRGB的ASCII | 数据块的类型 |
00 |
0 | sRGB模式 | 1 bytes | 有0 1 2 3 四种模式可选,可以参考W3对sRGB的介绍 |
aece 1ce9 |
CRC</ |