PNG

圖像文件的無損壓縮文件格式系列

便携式网络图形(英語:Portable Network GraphicsPNG)是一种支持无损压缩位图图形格式,支持索引、灰度RGB三种颜色方案以及Alpha通道等特性。PNG的开发目标是改善并取代GIF作为适合网络传输的格式而不需专利许可,所以被广泛应用于互联网及其他方面上。

可攜式網路圖形
Portable Network Graphics

PNG transparency demonstration 1.png

透明的8位元PNG圖片
扩展名.png
互联网媒体类型image/png
类型代码英语Type code
  • PNG
  • PNGf
统一类型标识public.png
开发者W3C
初始版本1996年10月1日,​25年前​(1996-10-01
格式类型無損壓縮
扩展为
标准
自由格式

PNG另一个非正式的名称来源为递归缩写:“PNG is Not GIF”。PNG的官方念法是“平”(/pɪŋ/),[1]但是多数人是当成三个英文字母分开读。[2]

PNG圖片大多數都使用PNG作为扩展名,其互联网媒体类型image/png[3]PNG于1997年3月作为知识性RFC 2083发布,于2004年作为ISO/IEC标准发布。

特性编辑

  • 支持256色调色板技术以产生小体积文件
  • 最高支持24位真彩色图像以及8位灰度图像
  • 支持Alpha通道的透明/半透明特性。
  • 支持图像亮度的Gamma校准信息。
  • 支持存储附加文本信息,以保留图像名称、作者、版权、创作时间、注释等信息。
  • 支持无损压缩。
  • 渐近显示和流式读写,适合在网络传输中快速显示预览效果后再展示全貌。
  • 使用CRC防止文件出错。
  • 最新的PNG标准允许在一个文件内存储多幅图像。

版本及历史编辑

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现行版本是国际标准(ISOIEC 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 壓縮文本數據塊 無限制
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的基础上另有发展出支持动画的APNGMNG格式,但目前普及度不高。

PNG在IE6等旧代浏览器上的支持较差。

与JPEG相比编辑

JPEG可以对照片(或类似)图像生成更小的文件,这是由于JPEG采用了一种针对照片图像的特定有损编码方法,这种编码适用于低对比,图像颜色过渡平滑,雜訊多,且结构不规则的情况下。如果在这种情况下用PNG代替JPEG,文件尺寸增大很多,而图像质量的提高有限。相应的,如果保存文本,线条或类似的边缘清晰,有大块相同颜色区域的图像,PNG格式的压缩效果就要比JPEG好很多,并且不会出现JPEG那样的高对比度区域的图像失真。如果图像既有清晰边缘,又有照片图像的特点,就需要在这两种格式之间权衡一下了。JPEG不支持透明度。

由于JPEG是有损压缩,会产生迭代失真,在重复压缩和解码的过程中会不断丢失信息使图像质量下降。由于PNG是无损的,保存将要被编辑的图像来说更加合适。虽然PNG压缩照片图像也有效,但有专门针对照片图像设计的无损压缩格式,例如无损JPEG2000DNG。总的来说这些格式都不能做到适用所有图像。对于将要发布的图像可以保存成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有了很好的支援。

参考文献编辑

  1. ^ History of PNG. Libpng.org. 29 May 2010 [2010-10-20]. (原始内容存档于2004-10-16). 
  2. ^ Definition of PNG noun from the Oxford Advanced Learner's Dictionary. Oxford Learner's Dictionaries. [2018-01-21]. (原始内容存档于2019-04-22). 
  3. ^ Registration of new Media Type image/png. IANA. 1996-07-27 [2018-01-09]. (原始内容存档于2017-09-15). 
  4. ^ Microsoft技術支援服務 - You cannot view some PNG images in Internet Explorer 6页面存档备份,存于互联网档案馆),於2009年6月1日查閱。
  5. ^ The PNG problem in Windows Internet Explorer页面存档备份,存于互联网档案馆),於2009年6月1日查閱。

外部链接编辑