版本记录
版本号 | 时间 |
---|---|
V1.0 | 2017.09.05 |
前言
只要是做图片的或者与图片相关的,那么图片的格式就是一个不可以绕过的问题,我们见过很多的图片格式,但是具体不同的图片格式是如何定义的,又具有什么特点,很多时候我们都没有深入研究过,下面我们就开始深入研究。
几种图片格式
图片有很多的格式,包括PNG
、JPEG
、JPG
、BMP
等,下面我们就详细的说一下这几张图片的格式,并进行详细的对比。
PNG
便携式网络图形(Portable Network Graphics)
是一种无损压缩的位图图形格式 。其设计目的是试图替代GIF
和TIFF
文件格式,同时增加一些GIF文件格式所不具备的特性。PNG的名称来源于“可移植网络图形格式(Portable Network Graphic Format,PNG)
”,也有一个非官方解释“PNG's Not GIF”
。PNG使用从LZ77
派生的无损数据压缩算法,一般应用于JAVA程序、网页或S60程序中,原因是它压缩比高,生成文件体积小。
1. 特点
PNG格式的图片具有如下特点:
体积小:网络通讯中因受带宽制约,在保证图片清晰、逼真的前提下,网页中不可能大范围的使用文件较大的
bmp
格式文件。无损压缩:
PNG
文件采用LZ77
算法的派生算法进行压缩,其结果是获得高的压缩比,不损失数据。它利用特殊的编码方法标记重复出现的数据,因而对图像的颜色没有影响,也不可能产生颜色的损失,这样就可以重复保存而不降低图像质量。索引彩色模式:
PNG-8
格式与GIF
图像类似,同样采用8位调色板将RGB彩色图像转换为索引彩色图像。图像中保存的不再是各个像素的彩色信息,而是从图像中挑选出来的具有代表性的颜色编号,每一编号对应一种颜色,图像的数据量也因此减少,这对彩色图像的传播非常有利。更优化的网络传输显示: PNG图像在浏览器上采用流式浏览,即使经过交错处理的图像会在完全下载之前提供浏览者一个基本的图像内容,然后再逐渐清晰起来。它允许连续读出和写入图像数据,这个特性很适合于在通信过程中显示和生成图像。
支持透明效果:PNG可以为原图像定义
256
个透明层次,使得彩色图像的边缘能与任何背景平滑地融合,从而彻底地消除锯齿边缘。这种功能是GIF
和JPEG
没有的。PNG同时还支持真彩和灰度级图像的Alpha通道透明度。
最高支持
24
位真彩色图像以及8
位灰度图像。支持
Alpha
通道的透明/半透明特性。支持图像亮度的
Gamma
校准信息。支持存储附加文本信息,以保留图像名称、作者、版权、创作时间、注释等信息。
渐近显示和流式读写,适合在网络传输中快速显示预览效果后再展示全貌。
使用
CRC
防止文件出错。最新的
PNG
标准允许在一个文件内存储多幅图像。
2. 文件结构
PNG图像格式文件(或者称为数据流)由一个8字节的PNG文件署名(PNG file signature)
域和按照特定结构组织的3个以上的数据块(chunk)
组成。
文件署名域
8字节的PNG文件署名域用来识别该文件是不是PNG文件。该域的值是:
- 十进制数
137 80 78 71 13 10 26 10
- 十六进制数
89 50 4e 47 0d 0a 1a 0a
数据块类型码命名约定
辅助位: 第一个字节的第5位是0(大写)=关键,1(小写)=辅助。一个解码器遇到一个不能识别的块时,如果发现辅助位为1则可以放心地忽略该块,并继续显示图像。
私人位:第二个字节的第5位是0(大写)=公用,1(小写)=私人。应用程序也可以定义私有(未注册)块来达到自己的目的。需要注意的是解码器并不需要理会块的私人位——因为它没有功能上的意义,它只是一个管理上的便利,以确保公共块和私人块名称不会冲突。
保留位:第三个字节的第5位必须为0(大写)。该位的意义是为将来可能的扩展保留。
-
安全拷贝位:第4个字节的第5位是0(大写)=复制不安全,1(小写)=复制安全。
- 该位为0(大写),表示该块的内容随图像数据的更新而更新,如果修改了任何关键数据块(包括增添、修改、删除以及关键块的重新排序),就不要把不能识别且“复制不安全”的块输出到新的png文件中。(如果png编辑器可以识别该块,那么当然可以选择输出适当修改后的版本)
- 该位为1(小写),表示不论png编辑器是否可以识别该块,也不管png文件被多大程度地修改,该块都可以被拷贝到修改后的png文件中。
- 如果只有辅助块的增添、删除、修改或辅助块的重新排序,png编辑器将总是被允许将不能识别的辅助块拷贝到修改后的png文件中,这就要求:不论”安全拷贝位“如何设置,一个辅助块都不能仅随其它辅助块的更新而更新。(即,如果在png中加入自定义的辅助块,必须做到当仅更新其他辅助块中的数据时,该辅助块不需要连带更新,否则上述机制就会破坏该辅助块与其余图像数据的一致性)
- 如果png编辑器遇到一个不能识别的关键块,因为没有办法确定修改包含这种块的文件后png文件还是否有效,所以png编辑器应立刻停止修改这个png文件。(简单地删除这个块的做法不够好,因为这个块还可能与解码其他块有关)
- 复制安全/不安全的机制是为辅助块设计的。对于关键块,”安全拷贝位“应该总是为0。
3. 数据块结构
PNG定义了两种类型的数据块,一种是称为关键数据块(critical chunk)
,这是必需的数据块,另一种叫做辅助数据块(ancillary chunks)
,这是可选的数据块。关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们,PNG读写软件也都必须要支持这些数据块。虽然PNG文件规范没有要求PNG编译码器对可选数据块进行编码和译码,但规范提倡支持可选数据块。
数据块的4个域组成如下图所示。
下面我们就分析下这个结构。
- 长度:一个4字节的无符号整数,给出数据块的数据字段的长度(以字节计)。 长度只计算数据域,为了兼容一些不支持无符号的语言,所以长度限制在(231 - 1)字节,不能达到(232 - 1)字节。
- 数据块类型码:一个4字节的块类型代码。 为了便于描述和检查PNG文件,类型代码仅限于大写和小写的ASCII字母(A - Z和a - z,使用十进制ASCII代码表示为65-90和97-122)。 然而,编码器和解码器必须把代码作为固定的二进制值而非字符串来处理。
- 数据域:数据块的数据域,存储按照数据块类型码指定的数据(如果有的话)。 该字段可以是长度为零。
- 循环冗余检测:一个4字节的CRC(循环冗余校验)计算,在所述块的前面的字节,包括该块类型的代码和数据块的数据字段,但是不包括长度字段。 CRC始终存在,即使不包含数据块。
CRC(cyclic redundancy check)
域中的值是对Chunk Type Code
域和Chunk Data
域中的数据进行计算得到的。CRC具体算法定义在ISO 3309
和ITU-T V.42
中。
关键数据块
关键数据块的组成如下所示。
-
IHDR
:文件头数据块IHDR(header chunk)
:它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。 -
PLTE
:调色板数据块PLTE(palette chunk)
包含有与索引彩色图像(indexed-color image)
相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)
之前。PLTE数据块是定义图像的调色板信息,PLTE可以包含1~256个调色板信息,每一个调色板信息由3个字节组成。 -
IDAT
:图像数据块IDAT(image data chunk)
:它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。IDAT存放着图像真正的数据信息,因此,如果能够了解IDAT的结构,我们就可以很方便的生成PNG图像。 -
IEND
:图像结束数据IEND(image trailer chunk)
:它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。如果我们仔细观察PNG文件,我们会发现,文件的结尾12个字符看起来总应该是这样的:
0000000049454E44AE426082
,不难明白,由于数据块结构的定义,IEND数据块的长度总是0(00 00 00 00
,除非人为加入信息),数据标识总是IEND(49 45 4E 44)
,因此,CRC码也总是AE 42 60 82
。
辅助数据块
看下面这个数据结构图。
4. 几种PNG格式
PNG格式有8位、24位、32位三种形式,其中8位PNG支持两种不同的透明形式(索引透明和alpha透明),24位PNG不支持透明,32位PNG在24位基础上增加了8位透明通道,因此可展现256级透明程度。
PNG8和PNG24后面的数字则是代表这种PNG格式最多可以索引和存储的颜色值。”8″代表2的8次方也就是256色,而24则代表2的24次方大概有1600多万色。
具体如下图所示。
5. 与GIF比较
- 一般情况下将静态GIF图像无损转换为PNG后可以压缩率会略为提高(前提是同样采用8位索引模式)。
- PNG可提供更大颜色深度的支持,包括24位(8位3通道)和48位(16位3通道)真彩色。加入α通道后可进一步支持每像素64位的表示。
- 超过8位色深的PNG图像转换为GIF时,图像质量会由于分色(颜色数减少)而下降。
- GIF原生支持动态图像,PNG只能通过非标准实现,在PNG的基础上另有发展出支持动画的APNG和MNG格式,但目前普及度不高。
参考文章
1. PNG,JPEG,BMP,JIF图片格式详解及其对比
2. PNG
后记
未完,待续~~~