PNG
便携式网络图形(英語:,PNG)是一种支持无损压缩的位图图形格式,支持索引、灰度、RGB三种颜色方案以及Alpha通道等特性。PNG的开发目标是改善并取代GIF作为适合网络传输的格式而不需专利许可,所以受广泛应用于互联网及其他方面上。
透明的8位元PNG圖片 | |
.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圖片的壓縮主要分有兩個階段:
- 預解析()
- 壓縮()
由於壓縮方式主要由以上兩個階段構成,優化方向也對應著兩個階段。針對預解析階段做優化主要的選擇是去優化差分編碼器,讓編碼出的結果能出現盡可能多的零值或是相同的值。針對壓縮階段的優化則是找出更好的Deflate算法,以獲得更高的壓縮率。
預解析
在這階段中,圖片會做先做些預處理,以利後續壓縮。 每次會處理圖片中某一行()的數據,首先經過濾波器()來處理這些數據,每個像素點()在不同通道中( ex:RGB)的數值都會經過濾波器運算,然就得出的結果會交由差分處理器來重新計算通道中的數值。 差分處理器會將目前這個像素點上通道中的數值和之前或之上(EX:左邊上方)像素點做對比,根據差異進行差分編碼。若是相鄰的像素點在通道上的數值非常接近,就會得出很多1,0,-1這種很小的值。 整個prediction階段要做的事就是找到適合的差分編碼器,使得最終差分編碼的結果盡可能的都是重複很小或是零的值,這一階段的結果會影響到Compression階段中能實現的壓縮率。
壓縮
經過預解析階段之後,將編碼出的結果輸出給Deflate(是一種無損數據壓縮算法,同時使用了LZ77和Huffman Coding方法),由其執行真正的壓縮操作,在此階段會通過LZ77和Huffman Coding方法來對圖像進行編碼,最後將處理後的圖片結果保存。最終的壓縮率主要受到兩方面的影響:
- 預解析階段()的處理結果:對於RGB通道數值相近的像素區域,也就是編碼結果有很多零值的區域,在壓縮階段得當的壓縮率會特別高,若是相鄰區域的顏色差異大,則壓縮效果就會大打折扣。
- Deflate 每一行的匹配情形:在整個壓縮處理過程中都是以行()為單位來進行處理。而在處裡數據的過程中,處裡的符號數被限制在3-258之間,換言之,最高的壓縮率可以達到1032:1,當出現的符號數小於3時,就可能會出現無法匹配的情況。因此圖片的寬度也會是一個可能影響最終壓縮效果的因素之一。
壓縮方案
PNG壓縮提供兩種壓縮方案
- 無損壓縮():數據經過壓縮之後,信息不受損失,能夠完全還原至壓縮前的模樣,通常此種壓縮方案的壓縮率有一定的限制。
- 有損壓縮():數據經過壓縮之後,信息數據會和原始數據不同,但僅限於些微差距,通常此種壓縮方案能提供非常高的壓縮率。
無損壓縮方案
目前大部分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有了很好的支援。
参考文献
- . Libpng.org. 29 May 2010 [2010-10-20]. (原始内容存档于2004-10-16).
- . Oxford Learner's Dictionaries. [2018-01-21]. (原始内容存档于2019-04-22).
- . 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日查閱。