发展历史
在PNG传播过程中,很多网络浏览器经过很长时间才开始完全支持PNG格式,如Microsoft Windows默认的Internet Explorer浏览器一直到7.0版才支持PNG格式中的半透明效果,较早期的版本(如6.0 SP1)需要下载Hotfix 或由网站提供额外的Script去支持,这造成PNG格式并没有得到广泛的认知。
1996年6月提出PNF(Portable Network Frame)草案,当年8月改名为MNG(Multiple-image Network Graphics)。
PNG的1.0版本规范于1996年7月1日发布,后来被称为RFC 2083标准,并在1996年10月1日成为W3C建议。
PNG的1.1版本进行了部分小幅修改并增加了三个新的数据块定义,于1998年12月31日发布。
PNG的1.2版本增加了另外一个数据块,于1999年8月11日发布。
PNG现行版本是国际标准(ISO/IEC 15948:2003),并在2003年11月10日作为W3C建议发布。这个版本与1.2版仅有细微差别。
特性
体积小 网络通讯中因受带宽制约,在保证图片清晰、逼真的前提下,网页中不可能大范围的使用文件较大的bmp格式文件。
无损压缩 PNG文件采用LZ77算法的派生算法进行压缩,其结果是获得高的压缩比,不损失数据。它利用特殊的编码方法标记重复出现的数据,因而对图像的颜色没有影响,也不可能产生颜色的损失,这样就可以重复保存而不降低图像质量。
索引彩色模式 PNG-8格式与GIF图像类似,同样采用8位调色板将RGB彩色图像转换为索引彩色图像。图像中保存的不再是各个像素的彩色信息,而是从图像中挑选出来的具有代表性的颜色编号,每一编号对应一种颜色,图像的数据量也因此减少,这对彩色图像的传播非常有利。
更优化的网络传输显示 PNG图像在浏览器上采用流式浏览,即使经过交错处理的图像会在完全下载之前提供浏览者一个基本的图像内容,然后再逐渐清晰起来。它允许连续读出和写入图像数据,这个特性很适合于在通信过程中显示和生成图像。
支持透明效果 PNG可以为原图像定义256个透明层次,使得彩色图像的边缘能与任何背景平滑地融合,从而彻底地消除锯齿边缘。这种功能是GIF和JPEG没有的。
最高支持24位真彩色图像以及8位灰度图像。
支持Alpha通道的透明/半透明特性。
支持图像亮度的Gamma校准信息。
支持存储附加文本信息,以保留图像名称、作者、版权、创作时间、注释等信息。
渐近显示和流式读写,适合在网络传输中快速显示预览效果后再展示全貌。
使用CRC防止文件出错。
文件结构
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。(译者注:即png格式约定关键块的内容总随图像数据的更新而更新)
关于安全拷贝位的原文:
If a chunk's safe-to-copy bit is 1, the chunk may be copied to a modified PNG datastream whether or not the PNG editor recognizes the chunk type, and regardless of the extent of the datastream modifications.
If a chunk's safe-to-copy bit is 0, it indicates that the chunk depends on the image data. If the program has madeany changes to critical chunks, including addition, modification, deletion, or reordering of critical chunks, then unrecognized unsafe chunks shallnot be copied to the output PNG datastream. (Of course, if the program does recognize the chunk,it can choose to output an appropriately modified version.)
A PNG editor is always allowed to copy all unrecognized ancillary chunks if it has only added, deleted, modified, or reordered ancillary chunks. This implies that it is not permissible for ancillary chunks to depend on other ancillary chunks.
PNG editors shall terminate on encountering an unrecognized critical chunk type, because there is no way to be certain that avalid datastream will result from modifying a datastream containing such a chunk. (Simply discarding the chunk is not good enough, because it might have unknown implications for the interpretation of other chunks.) The safe/unsafe mechanism is intended for use with ancillary chunks. The safe-to-copy bit will always be 0 for critical chunks.
数据块结构
PNG定义了两种类型的数据块,一种是称为关键数据块(critical chunk),这是必需的数据块,另一种叫做辅助数据块(ancillary chunks),这是可选的数据块。关键数据块定义了4个标准数据块,每个PNG文件都必须包含它们,PNG读写软件也都必须要支持这些数据块。虽然PNG文件规范没有要求PNG编译码器对可选数据块进行编码和译码,但规范提倡支持可选数据块。
每个数据块都由表6-07所示的的4个域组成:
名称
(231-1)字节
Chunk Type Code(数据块类型码)
4字节
数据块类型码由ASCII字母(A-Z和a-z)组成
Chunk Data(数据块数据)
可变长度
存储按照Chunk Type Code指定的数据
CRC(循环冗余检测)
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中,其值按下面的CRC码生成多项式进行计算:
x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
关键数据块
PNG文件格式中的数据块
数据块符号
数据块名称
多数据块
可选否
位置限制
IHDR
文件头数据块IHDR(header chunk):它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。
域的名称
字节数
说明
PLTE
调色板数据块PLTE(palette chunk)包含有与索引彩色图像(indexed-color image)相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前。
PLTE数据块是定义图像的调色板信息,PLTE可以包含1~256个调色板信息,每一个调色板信息由3个字节组成:
颜色
字节
意义
Red
1 byte
0 = 黑色, 255 = 红
Green
1 byte
0 = 黑色, 255 = 绿色
Blue
1 byte
0 = 黑色, 255 = 蓝色
因此,调色板的长度应该是3的倍数,否则,这将是一个非法的调色板。
对于索引图像,调色板信息是必须的,调色板的颜色索引从0开始编号,然后是1、2……,调色板的颜色数不能超过色深中规定的颜色数(如图像色深为4的时候,调色板中的颜色数不可以超过2^4=16),否则,这将导致PNG图像不合法。
真彩色图像和带α通道数据的真彩色图像也可以有调色板数据块,目的是便于非真彩色显示程序用它来量化图像数据,从而显示该图像。
IDAT
图像数据块IDAT(image data chunk):它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。
IDAT存放着图像真正的数据信息,因此,如果能够了解IDAT的结构,我们就可以很方便的生成PNG图像。
IEND
图像结束数据IEND(image trailer chunk):它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。
0000000049454E44AE426082
辅助数据块
PNG文件格式中的数据块
数据块符号
数据块名称
多数据块
可选否
位置限制
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多万色。
格式
最高支持色彩通道
索引色编辑支持
透明支持
PNG8
256索引色
支持
支持设定特定索引色为透明色(布尔透明)
支持为索引色附加8位透明度(256阶alpha透明)
PNG24
约1600万色
不支持
约1600万色
与其它格式相比
PNG vs GIF
一般情况下将静态GIF图像无损转换为PNG后可以压缩率会略为提高(前提是同样采用8位索引模式)。
PNG可提供更大颜色深度的支持,包括24位(8位3通道)和48位(16位3通道)真彩色。加入α通道后可进一步支持每像素64位的表示。
超过8位色深的PNG图像转换为GIF时,图像质量会由于分色(颜色数减少)而下降。
GIF原生支持动态图像,PNG只能通过非标准实现,在PNG的基础上另有发展出支持动画的APNG和MNG格式,但目前普及度不高。
PNG在IE6等旧浏览器上的支持较差。
PNG vs JPEG
JPEG可以对照片(或类似)图像生成更小的文件,这是由于JPEG采用了一种针对照片图像的特定有损编码方法,这种编码适用于低对比,图像颜色过渡平滑,噪声多,且结构不规则的情况下。如果在这种情况下用PNG代替JPEG,文件尺寸增大很多,而图像质量的提高有限。相应的,如果保存文本,线条或类似的边缘清晰,有大块相同颜色区域的图像,PNG格式的压缩效果就要比JPEG好很多,并且不会出现JPEG那样的高对比度区域的图像有损。如果图像既有清晰边缘,又有照片图像的特点,就在在这两种格式之间权衡一下了。JPEG不支持透明度。
由于JPEG是有损压缩,会产生迭代有损,在重复压缩和解码的过程中会不断丢失信息使图像质量下降。由于PNG是无损的,保存将要被编辑的图像来说更加合适。虽然PNG压缩照片图像也有效,但有专门针对照片图像设计的无损压缩格式,比如无损JPEG2000,Adobe DNG等。总的来说这些格式都不能做到适用所有图像。对于将要发布的图像可以保存成JPEG,用JPEG编码一次不会造成明显的图像有损。
PNG vs JPEG-LS
JPEG-LS是一个“几乎”无损压缩格式,相对于上面提到的有损JPEG压缩,它的知名度不高。它可以直接和PNG相比较,使用一组标准的测试图像。在Waterloo Repertoire ColorSet(一组标准测试图像)下,JPEG-LS通常表现要比PNG好10%-15%,但其中有一些图像PNG表现明显更好一些,大约50%-75%。所以,如果这两种格式都支持而且对图像文件大小很敏感的话,可以用这两种格式都试试,和图像数据本身有比较大关系。
PNG vs TIFF
TIFF是一个相当多方案结合的格式。它被广泛用作专业图像编辑软件之间图像交换的中间格式,因此它不断支持更多应用程序所需的功能,而对应用程序不关心的图像操作部分支持不多。这也意味着许多应用程序只能识别TIFF的一个子集,而产生更多的潜在混淆之处。
TIFF使用的最通用的无损压缩算法是LZW。这种算法--GIF中也在使用,直到2003年一直在专利保护之中。有一种TIFF变种使用与PNG相同的压缩算法,但是没有被许多专利程序所支持。TIFF也提供了一种特殊的无损压缩算法,类似CCITTGroup IV,可以对二值图像(比如传真或黑白文本)比PNG有更好的压缩效果。 PNG只支持非自左乘α,而TIFF也支持联合(自左乘)α。
PNG规范中不包含嵌入式EXIF(可交换图像文件格式)图像数据的标准,比如数码像机拍得的图像。而TIFF,JPEG 2000, DNG都支持EXIF。