PNG
便携式网络图形(英语:Portable Network Graphics,PNG)是一种支持无损压缩的位图图形格式,支持索引、灰度、RGB三种颜色方案以及Alpha通道等特性。PNG的开发目标是改善并取代GIF作为适合网络传输的格式而不需专利许可,所以受广泛应用于互联网及其他方面上。
扩展名 |
.png |
---|---|
互联网媒体类型 |
image/png |
类型代码 |
|
统一类型标识 | public.png |
开发者 | W3C |
首次发布 | 1996年10月1日 |
格式类型 | 无损压缩 |
扩展为 | |
标准 | |
免费格式? | 是 |
PNG另一个非正式的名称来源为递归缩写:“PNG is Not GIF”。PNG的官方念法是“平”(英语IPA:/pɪŋ/;“平”是以国语发音),[1]但是多数人是当成三个英文字母分开读。[2]
PNG图片大多数都使用PNG
作为扩展名,其互联网媒体类型为image/png
。[3]PNG于1997年3月作为知识性RFC 2083发布,于2004年作为ISO/IEC标准发布。
特性
编辑版本及历史
编辑1995年早期,Unisys公司根据它在GIF格式中使用的LZW数据压缩算法的软件专利(美国 第4558302号(页面存档备份,存于互联网档案馆))开始商业收费。为避免专利影响,用于表现单张图像的PNG、用于表现动画的Multiple-image Network Graphics图形文件格式同时创建出来。1999年8月,Unisys公司进一步中止了对自由软件和非商用软件开发者的GIF专利免费许可,从而使PNG格式获得了更多的关注。
在PNG传播过程中,很多网络浏览器经过很长时间才开始完全支持PNG格式;如Microsoft Windows默认的Internet Explorer浏览器一直到7.0版才支持PNG格式中的半透明效果,较早期的版本(如6.0 SP1)需要下载Hotfix [4]或由网站提供额外的Script去支持。[5]这造成PNG格式并没有得到广泛的认知。
- 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版仅有细微差别。
此外也产生了基于PNG的动画格式:1996年6月提出PNF(Portable Network Frame)草案,当年8月改名为MNG(Multiple-image Network Graphics),但由于较为复杂,实现支持的软件较少。2004年末,PNG的动画扩展——APNG出现。这是一个相对于MNG更简单的动画实现方案,不识别APNG格式的PNG解码器至少能够正常回放第一幅普通PNG画面,相反地得到大部分显示或编辑的软件支持。
文件结构
编辑存储类型
编辑PNG图片主要由三种类型存储
- PNG 8:图片使用8 bits来存储,可以用2的8次方大小个种类颜色来存储一张黑白的图片。也就是说PNG 8能存储256种颜色,因为颜色少,文件体积也非常小,一张图片如果颜色简单,将它设置成PNG 8的图片是非常省空间合适的。
- PNG 24:图片使用24bits来存储,用三个8bits分别去表示 R(红)、G(绿)、B(蓝)三个通道(Channel)的数值。可以表达256乘以256乘以256=16777216种颜色的图片,色彩丰富度更高,但相对的所占用的空间也就更大了。
- PNG 32:图片使用32bits来存储,相当于PNG 24 加上 8bits的透明颜色通道,总共有R(红)、G(绿)、B(蓝)、A(透明)四个通道。图片能表示的色彩跟PNG 24一样多,并且还支持256种透明度,能让图片色彩更加丰富。
文件资料构成
编辑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。
十六进制 | 含义 |
---|---|
89 | 用于检测传输系统是否支持8位的字符编码(8 bit data),用以减少将文本文件被错误的识别成PNG文件的机会,反之亦然。 |
50 4E 47 | PNG每个字母对应的ASCII,让用户可以使用文本编辑器查看时,识别出是PNG文件。 |
0D 0A | DOS风格的换行符(CRLF)。用于DOS-Unix数据的换行符转换。 |
1A | 在DOS命令行下,用于阻止文件显示的文件结束符。 |
0A | Unix风格的换行符(LF)。用于Unix-DOS换行符的转换。 |
PNG定义了两种类型的数据块:一种是PNG文件必须包含、读写软件也都必须要支持的关键块(critical chunk);另一种叫做辅助块(ancillary chunks),PNG允许软件忽略它不认识的附加块。这种基于数据块的设计,允许PNG格式在扩展时仍能保持与旧版本兼容。
数据块结构
编辑PNG文件中,每个数据块都由四个部分组成,如下:
名称 | 字节数 | 说明 |
---|---|---|
长度(Length) | 4字节 | 指定数据块中数据区域的长度,长度不可超过(231-1)个字节 |
数据块类型码(Chunk Type Code) | 4字节 | 数据块类型码由ASCII字母(A-Z和a-z)组成的"数据块符号" |
数据块数据(Chunk Data) | 可变长度 | 存储数据块类型码指定的数据 |
循环冗余检测(CRC) | 4字节 | 存储用来检测是否文件传输有误的循环冗余码 |
关键数据块中有4个标准数据块:
- 文件头数据块IHDR(header chunk):包含有图像基本信息,作为第一个数据块出现并只出现一次。
- 调色板数据块PLTE(palette chunk):必须放在图像数据块之前。
- 图像数据块IDAT(image data chunk):存储实际图像数据。PNG数据允许包含多个连续的图像数据块。
- 图像结束数据IEND(image trailer chunk):放在文件尾部,表示PNG数据流结束。
其余辅助数据块列表:
数据块识别符号 | 数据块含意 | 数据块位置限制 |
---|---|---|
cHRM | 基色和白色点数据块 | 放在PLTE和IDAT之前 |
gAMA | 图像γ数据块 | 放在PLTE和IDAT之前 |
sBIT | 样本有效位数据块 | 放在PLTE和IDAT之前 |
bKGD | 背景颜色数据块 | 放在PLTE之后IDAT之前 |
hIST | 图像直方图数据块 | 放在PLTE之后IDAT之前 |
tRNS | 图像透明数据块 | 放在PLTE之后IDAT之前 |
pHYs | 物理像素尺寸数据块 | 放在IDAT之前 |
tIME | 图像最后修改时间数据块 | 无限制 |
tEXt | 文件基本消息数据块 | 无限制 |
zTXt | 压缩文本数据块 | 无限制 |
eXIf | Exif数据块 | 放在IHDR和IEND之间,
但不能在IDAT块之间 |
sCAL | (专用公共数据块) | 放在IDAT之前 |
oFFs | (专用公共数据块) | 放在IDAT之前 |
fRAc | (专用公共数据块) | 无限制 |
gIFg | (专用公共数据块) | 无限制 |
gIFt | (专用公共数据块) | 无限制 |
gIFx | (专用公共数据块) | 无限制 |
压缩方式
编辑PNG图片的压缩主要分有两个阶段:
- 预解析(Prediction)
- 压缩(Compression)
由于压缩方式主要由以上两个阶段构成,优化方向也对应着两个阶段。针对预解析阶段做优化主要的选择是去优化差分编码器,让编码出的结果能出现尽可能多的零值或是相同的值。针对压缩阶段的优化则是找出更好的Deflate算法,以获得更高的压缩率。
预解析
编辑在这阶段中,图片会做先做些预处理,以利后续压缩。 每次会处理图片中某一行(column)的数据,首先经过滤波器(Filter)来处理这些数据,每个像素点(Pixel)在不同通道中(Channel ex:RGB)的数值都会经过滤波器运算,然就得出的结果会交由差分处理器来重新计算通道中的数值。 差分处理器会将目前这个像素点上通道中的数值和之前或之上(EX:左边上方)像素点做对比,根据差异进行差分编码。若是相邻的像素点在通道上的数值非常接近,就会得出很多1,0,-1这种很小的值。 整个prediction阶段要做的事就是找到适合的差分编码器,使得最终差分编码的结果尽可能的都是重复很小或是零的值,这一阶段的结果会影响到Compression阶段中能实现的压缩率。
压缩
编辑经过预解析阶段之后,将编码出的结果输出给Deflate(是一种无损数据压缩算法,同时使用了LZ77和Huffman Coding方法),由其执行真正的压缩操作,在此阶段会通过LZ77和Huffman Coding方法来对图像进行编码,最后将处理后的图片结果保存。最终的压缩率主要受到两方面的影响:
- 预解析阶段(Prediction)的处理结果:对于RGB通道数值相近的像素区域,也就是编码结果有很多零值的区域,在压缩阶段得当的压缩率会特别高,若是相邻区域的颜色差异大,则压缩效果就会大打折扣。
- Deflate 每一行的匹配情形:在整个压缩处理过程中都是以行(column)为单位来进行处理。而在处里数据的过程中,处里的符号数被限制在3-258之间,换言之,最高的压缩率可以达到1032:1,当出现的符号数小于3时,就可能会出现无法匹配的情况。因此图片的宽度也会是一个可能影响最终压缩效果的因素之一。
压缩方案
编辑PNG压缩提供两种压缩方案
- 无损压缩(Lossless Compression):数据经过压缩之后,信息不受损失,能够完全还原至压缩前的模样,通常此种压缩方案的压缩率有一定的限制。
- 有损压缩(Lossy compression):数据经过压缩之后,信息数据会和原始数据不同,但仅限于些微差距,通常此种压缩方案能提供非常高的压缩率。
无损压缩方案
编辑目前大部分PNG的压缩采用基于LZ77派生算法,使得它压缩比率更高,生成的文件体积更小,并且不损失数据。
有损压缩方案
编辑由于PNG原本的无损压缩方案在压缩率上有一定的限制,有些开源者无法接受既有的压缩率,因此基于PNG原本的压缩方式开发新的有损压缩方案,在工程上与得到了一定的应用。例如 TinyPNG,根据官方公开的信息,其利用了Quantization的技术来实现提高压缩率,通过合并相似的颜色将24位的PNG图片压缩成更小的8位图片。其中更著名的PNG有损压缩算法pngquant,在Github上有完整的开源代码,同样也是使用了Vector Quantization来减少图片中颜色的种类,在矢量化过程中将像素点根据颜色相似程度进行分组,随后组内的像素统计出一个中心颜色并将所有组内像素都替代为此中心颜色。矢量化会造成图片失真,如何在压缩率与图片质量之间获取一个恰到好处的平衡点是个值得优化的方向。
与其他格式相比
编辑与GIF相比
编辑- 一般情况下将静态GIF图像无损转换为PNG后可以压缩率会略为提高(前提是同样采用8位索引模式)。
- PNG可提供更大颜色深度的支持,包括24位(8位3通道)和48位(16位3通道)真彩色。加入Alpha通道后可进一步支持每像素64位的表示。
- 超过8位色深的PNG图像转换为GIF时,图像质量会由于分色(颜色数减少)而下降。
- GIF原生支持动态图像,PNG只能通过非标准实现,在PNG的基础上另有发展出支持动画的APNG和MNG格式,但目前普及度不高。
PNG在IE6等旧代浏览器上的支持较差。
与JPEG相比
编辑JPEG可以对照片(或类似)图像生成更小的文件,这是由于JPEG采用了一种针对照片图像的特定有损编码方法,这种编码适用于低对比,图像颜色过渡平滑,噪声多,且结构不规则的情况下。如果在这种情况下用PNG代替JPEG,文件尺寸增大很多,而图像质量的提高有限。相应的,如果保存文本,线条或类似的边缘清晰,有大块相同颜色区域的图像,PNG格式的压缩效果就要比JPEG好很多,并且不会出现JPEG那样的高对比度区域的图像失真。如果图像既有清晰边缘,又有照片图像的特点,就需要在这两种格式之间权衡一下了。JPEG不支持透明度。
由于JPEG是有损压缩,会产生迭代失真,在重复压缩和解码的过程中会不断丢失信息使图像质量下降。由于PNG是无损的,保存将要编辑的图像来说更加合适。虽然PNG压缩照片图像也有效,但有专门针对照片图像设计的无损压缩格式,例如无损JPEG2000和DNG。总的来说这些格式都不能做到适用所有图像。对于将要发布的图像可以保存成JPEG,用JPEG编码一次不会造成明显的图像失真。
与JPEG-LS相比
编辑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(可交换图像文件格式)图像数据的标准,比如数码像机拍得的图像。而TIFF,JPEG 2000, DNG都支持EXIF。
早期的浏览器不支持PNG图像;JPEG和GIF是主流图像格式。由于GIF的颜色深度限制,网页中的有颜色过渡的图像都是使用JPEG。不管怎样,JPEG压缩都会导致图像的轻微模糊。而PNG可以做到在相应颜色深度下的尽可能精确,同时保持图像文件不大。PNG已经渐渐成为一种对于小的梯度图像的较好的选择,众多浏览器都已经对PNG有了很好的支持。
参考文献
编辑- ^ History of PNG. Libpng.org. 29 May 2010 [2010-10-20]. (原始内容存档于2004-10-16).
- ^ Definition of PNG noun from the Oxford Advanced Learner's Dictionary. Oxford Learner's Dictionaries. [2018-01-21]. (原始内容存档于2019-04-22).
- ^ Registration of new Media Type image/png. IANA. 1996-07-27 [2018-01-09]. (原始内容存档于2017-09-15).
- ^ Microsoft技术支持服务 - You cannot view some PNG images in Internet Explorer 6 (页面存档备份,存于互联网档案馆),于2009年6月1日查阅。
- ^ The PNG problem in Windows Internet Explorer (页面存档备份,存于互联网档案馆),于2009年6月1日查阅。