Loading AI tools
圖像文件的無損壓縮文件格式系列 来自维基百科,自由的百科全书
便攜式網絡圖形(英語:Portable Network Graphics,PNG)是一種支持無損壓縮的位圖圖形格式,支持索引、灰度、RGB三種顏色方案以及Alpha通道等特性。PNG的開發目標是改善並取代GIF作為適合網絡傳輸的格式而不需專利許可,所以受廣泛應用於互聯網及其他方面上。
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的動畫格式: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。
十六進制 | 含義 |
---|---|
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個標準數據塊:
其餘輔助數據塊列表:
數據塊識別符號 | 數據塊含意 | 數據塊位置限制 |
---|---|---|
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算法,以獲得更高的壓縮率。
在這階段中,圖片會做先做些預處理,以利後續壓縮。 每次會處理圖片中某一行(column)的數據,首先經過濾波器(Filter)來處理這些數據,每個像素點(Pixel)在不同通道中(Channel ex:RGB)的數值都會經過濾波器運算,然就得出的結果會交由差分處理器來重新計算通道中的數值。 差分處理器會將目前這個像素點上通道中的數值和之前或之上(EX:左邊上方)像素點做對比,根據差異進行差分編碼。若是相鄰的像素點在通道上的數值非常接近,就會得出很多1,0,-1這種很小的值。 整個prediction階段要做的事就是找到適合的差分編碼器,使得最終差分編碼的結果盡可能的都是重複很小或是零的值,這一階段的結果會影響到Compression階段中能實現的壓縮率。
經過預解析階段之後,將編碼出的結果輸出給Deflate(是一種無損數據壓縮算法,同時使用了LZ77和Huffman Coding方法),由其執行真正的壓縮操作,在此階段會通過LZ77和Huffman Coding方法來對圖像進行編碼,最後將處理後的圖片結果保存。最終的壓縮率主要受到兩方面的影響:
PNG壓縮提供兩種壓縮方案
目前大部分PNG的壓縮採用基於LZ77派生算法,使得它壓縮比率更高,生成的文件體積更小,並且不損失數據。
由於PNG原本的無損壓縮方案在壓縮率上有一定的限制,有些開源者無法接受既有的壓縮率,因此基於PNG原本的壓縮方式開發新的有損壓縮方案,在工程上與得到了一定的應用。例如 TinyPNG,根據官方公開的信息,其利用了Quantization的技術來實現提高壓縮率,通過合併相似的顏色將24位元的PNG圖片壓縮成更小的8位元圖片。其中更著名的PNG有損壓縮算法pngquant,在Github上有完整的開源代碼,同樣也是使用了Vector Quantization來減少圖片中顏色的種類,在矢量化過程中將像素點根據顏色相似程度進行分組,隨後組內的像素統計出一個中心顏色並將所有組內像素都替代為此中心顏色。矢量化會造成圖片失真,如何在壓縮率與圖片質量之間取得一個恰到好處的平衡點是個值得優化的方向。
PNG在IE6等舊代瀏覽器上的支持較差。
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使用的最通用的無損壓縮算法是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有了很好的支援。
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.