PNG
PNG
便携式网络图形(,PNG)是一种支持无损压缩的位图图形格式,支持索引、灰度、RGB三种颜色方案以及Alpha通道等特性。PNG的开发目标是改善并取代GIF作为适合网络传输的格式而不需专利许可,所以受广泛应用于互联网及其他方面上。
PNG另一个非正式的名称来源为递归缩写:“PNG is Not GIF”。PNG的官方念法是“平”(英语IPA:;「平」是以国语发音),但是多数人是当成三个英文字母分开读。
PNG图片大多数都使用作为扩展名,其互联网媒体类型为codice_1。PNG于1997年3月作为知识性RFC 2083发布,于2004年作为ISO/IEC标准发布。
版本及历史.
1995年早期,Unisys公司根据它在GIF格式中使用的LZW数据压缩算法的软件专利(美国 第4558302号(页面存档备份,存于-{zh-cn:互联网档案馆;zh-tw:网际网路档案馆;zh-hk:互联网档案馆;zh-sg:互联网档案馆;}-))开始商业收费。为避免专利影响,用于表现单张图像的PNG、用于表现动画的Multiple-image Network Graphics图形文件格式同时创建出来。1999年8月,Unisys公司进一步中止了对自由软件和非商用软件开发者的GIF专利免费许可,从而使PNG格式获得了更多的关注。
在PNG传播过程中,很多网络浏览器经过很长时间才开始完全支持PNG格式;如Microsoft Windows预设的Internet Explorer浏览器一直到7.0版才支持PNG格式中的半透明效果,较早期的版本(如6.0 SP1)需要下载Hotfix 或由网站提供额外的Script去支援。这造成PNG格式并没有得到广泛的认知。
此外也产生了基于PNG的动画格式:1996年6月提出PNF(Portable Network Frame)草案,当年8月改名为MNG(Multiple-image Network Graphics),但由于较为复杂,实现支持的软件较少。2004年末,PNG的动画扩展——APNG出现。这是一个相对于MNG更简单的动画实现方案,不识别APNG格式的PNG解码器至少能够正常回放第一幅普通PNG画面,相反地得到大部分显示或编辑的软件支持。
文件结构.
储存型别.
PNG图片主要由三种型别储存
档案资料构成.
PNG图像格式文件由一个8字节的PNG文件标识(file signature or file header)域和3个以上的后续数据块(chunk)如:IHDR、IDAT、IEND等组成。
PNG文件包括8字节文件署名(89 50 4E 47 0D 0A 1A 0A,十六进制),用来识别PNG格式,所有PNG图片档案内容开头都会有这一串header。
PNG定义了两种类型的数据块:一种是PNG文件必须包含、读写软件也都必须要支持的关键块(critical chunk);另一种叫做辅助块(ancillary chunks),PNG允许软件忽略它不认识的附加块。这种基于数据块的设计,允许PNG格式在扩展时仍能保持与旧版本兼容。
数据块结构.
PNG文件中,每个数据块都由四个部分组成,如下:
关键数据块中有4个标准数据块:
其余辅助数据块列表:
压缩方式.
PNG图片的压缩主要分有两个阶段:
由于压缩方式主要由以上两个阶段构成,优化方向也对应著两个阶段。针对预解析阶段做优化主要的选择是去优化差分编码器,让编码出的结果能出现尽可能多的零值或是相同的值。针对压缩阶段的优化则是找出更好的Deflate算法,以获得更高的压缩率。
预解析.
在这阶段中,图片会做先做些预处理,以利后续压缩。 每次会处理图片中某一行(--
)的数据,首先经过滤波器(--
)来处理这些数据,每个像素点(--
)在不同通道中(--
ex:RGB)的数值都会经过滤波器运算,然就得出的结果会交由差分处理器来重新计算通道中的数值。 差分处理器会将目前这个像素点上通道中的数值和之前或之上(EX:左边上方)像素点做对比,根据差异进行差分编码。若是相邻的像素点在通道上的数值非常接近,就会得出很多1,0,-1这种很小的值。 整个prediction阶段要做的事就是找到适合的差分编码器,使得最终差分编码的结果尽可能的都是重复很小或是零的值,这一阶段的结果会影响到Compression阶段中能实现的压缩率。
压缩.
经过预解析阶段之后,将编码出的结果输出给Deflate(是一种无损数据压缩算法,同时使用了LZ77和Huffman Coding方法),由其执行真正的压缩操作,在此阶段会通过LZ77和Huffman Coding方法来对图像进行编码,最后将处理后的图片结果保存。最终的压缩率主要受到两方面的影响:
)的处理结果:对于RGB通道数值相近的像素区域,也就是编码结果有很多零值的区域,在压缩阶段得当的压缩率会特别高,若是相邻区域的颜色差异大,则压缩效果就会大打折扣。
)为单位来进行处理。而在处里数据的过程中,处里的符号数被限制在3-258之间,换言之,最高的压缩率可以达到1032:1,当出现的符号数小于3时,就可能会出现无法匹配的情况。因此图片的宽度也会是一个可能影响最终压缩效果的因素之一。
压缩方案.
PNG压缩提供两种压缩方案
):数据经过压缩之后,信息不受损失,能够完全还原至压缩前的模样,通常此种压缩方案的压缩率有一定的限制。
):数据经过压缩之后,信息数据会和原始数据不同,但仅限于些微差距,通常此种压缩方案能提供非常高的压缩率。
无损压缩方案.
目前大部分PNG的压缩采用基于LZ77派生算法,使得它压缩比率更高,生成的文件体积更小,并且不损失数据。
有损压缩方案.
由于PNG原本的无损压缩方案在压缩率上有一定的限制,有些开源者无法接受既有的压缩率,因此基于PNG原本的压缩方式开发新的有损压缩方案,在工程上与得到了一定的应用。例如 TinyPNG,根据官方公开的信息,其利用了Quantization的技术来实现提高压缩率,通过合并相似的颜色将24位元的PNG图片压缩成更小的8位元图片。其中更著名的PNG有损压缩算法pngquant,在Github上有完整的开源代码,同样也是使用了Vector Quantization来减少图片中颜色的种类,在矢量化过程中将像素点根据颜色相似程度进行分组,随后组内的像素统计出一个中心颜色并将所有组内像素都替代为此中心颜色。矢量化会造成图片失真,如何在压缩率与图片质量之间取得一个恰到好处的平衡点是个值得优化的方向。
与其他格式相比.
与GIF相比.
PNG在IE6等旧代浏览器上的支持较差。
与JPEG相比.
JPEG可以对照片(或类似)图像生成更小的文件,这是由于JPEG采用了一种针对照片图像的特定有损编码方法,这种编码适用于低对比,图像颜色过渡平滑,杂讯多,且结构不规则的情况下。如果在这种情况下用PNG代替JPEG,文件尺寸增大很多,而图像质量的提高有限。相应的,如果保存文本,线条或类似的边缘清晰,有大块相同颜色区域的图像,PNG格式的压缩效果就要比JPEG好很多,并且不会出现JPEG那样的高对比度区域的图像失真。如果图像既有清晰边缘,又有照片图像的特点,就需要在这两种格式之间权衡一下了。JPEG不支持透明度。
由于JPEG是有损压缩,会产生迭代失真,在重复压缩和解码的过程中会不断丢失信息使图像质量下降。由于PNG是无损的,保存将要编辑的图像来说更加合适。虽然PNG压缩照片图像也有效,但有专门针对照片图像设计的无损压缩格式,例如无损JPEG2000和DNG。总的来说这些格式都不能做到适用所有图像。对于将要发布的图像可以保存成JPEG,用JPEG编码一次不会造成明显的图像失真。
与JPEG-LS相比.
是一个“几乎”无损压缩格式,相对于上面提到的有损JPEG压缩,它的知名度不高。它可以直接和PNG相比较,使用一组标准的测试图像。在Waterloo Repertoire ColorSet(一组标准测试图像)下,JPEG-LS通常表现要比PNG好10%-15%,但其中有一些图像PNG表现明显更好一些,大约50%-75%。所以,如果这两种格式都支持而且对图像文件大小很敏感的话,可以用这两种格式都试试,和图像数据本身有比较大关系。
与TIFF相比.
TIFF是一个相当多方案结合的格式。它广泛用作专业图像编辑软件之间图像交换的中间格式,因此它不断支援更多应用程式所需的功能,而对应用程式不关心的图像操作部分支援不多。这也意味着许多应用程式只能识别TIFF的一个子集,而产生更多的潜在混淆之处。
TIFF使用的最通用的无损压缩算法是LZW。这种算法在GIF中也在使用,直到2003年一直在专利保护之中。有一种TIFF变种使用与PNG相同的压缩算法,但是没有获许多专利程序所支援。TIFF也提供了一种特殊的无损压缩算法,类似CCITT Group IV,可以对二值图像(比如传真或黑白文本)比PNG有更好的压缩效果。
PNG只支援非自左乘α,而TIFF也支援联合(自左乘)α。
PNG规范中不包含嵌入式EXIF(可交换图像文件格式)图像数据的标准,比如-{zh-cn:数码像机;zh-tw:数位相机}-拍得的图像。而TIFF,JPEG 2000, DNG都支援EXIF。
早期的浏览器不支援PNG图像;JPEG和GIF是主流图像格式。由于GIF的颜色深度限制,网页中的有颜色过渡的图像都是使用JPEG。不管怎样,JPEG压缩都会导致图像的轻微模糊。而PNG可以做到在相应颜色深度下的尽可能精确,同时保持图像文件不大。PNG已经渐渐成为一种对于小的梯度图像的较好的选择,众多浏览器都已经对PNG有了很好的支援。