行動式網路圖形（，PNG）是一種支援無失真壓縮的點陣圖圖形格式，支援索引、灰度、RGB 三種顏色方案以及 Alpha 通道等特性。PNG 的開發目標是改善並取代 GIF 作為適合網路傳輸的格式而不需專利許可，所以受廣泛應用於網際網路及其他方面上。 PNG 另一個非正式的名稱來源為遞迴縮寫：PNG is Not GIF。PNG 的官方念法是 平（英語 IPA：；「平」是以國語發音），但是多數人是當成三個英文字母分開讀。 PNG 圖片大多數都使用作為副檔名，其網際網路媒體型別為 imagepng。PNG 於 1997 年 3 月作為知識性 RFC 2083 釋出，於 2004 年作為 ISOIEC 標準釋出。 特性 支援 256 色調色盤技術以產生小體積檔案 最高支援 24 位真彩色影像以及 8 位灰度影像。 支援 Alpha 通道的透明 半透明特性。 支援影像亮度的 Gamma 校準資訊。 支援儲存附加文字資訊，以保留影像名稱、作者、版權、創作時間、註釋等資訊。 支援無失真壓縮。 漸近顯示和流式讀寫，適合在網路傳輸中快速顯示預覽效果後再展示全貌。 使用 CRC 防止檔案出錯。 最新的 PNG 標準允許在一個檔案記憶體儲多幅影像。 版本及歷史 1995 年早期，Unisys 公司根據它在 GIF 格式中使用的 LZW 資料壓縮演算法的軟體專利（美國 第 4558302 號）開始商業收費。為避免專利影響，用於表現單張影像的 PNG、用於表現動畫的 Multipleimage Network Graphics 圖形檔案格式同時創建出來。1999 年 8 月，Unisys 公司進一步中止了對自由軟體和非商用軟體開發者的 GIF 專利免費許可，從而使 PNG 格式獲得了更多的關注。 在 PNG 傳播過程中，很多網路瀏覽器經過很長時間才開始完全支援 PNG 格式；如 Microsoft Windows 預設的 Internet Explorer 瀏覽器一直到 70 版才支援 PNG 格式中的半透明效果，較早期的版本（如 60 SP1）需要下載 Hotfix Microsoft 技術支援服務 You cannot view some PNG images in Internet Explorer 6 ，於 2009 年 6 月 1 日查閱。或由網站提供額外的 Script 去支援。The PNG problem in Windows Internet Explorer ，於 2009 年 6 月 1 日查閱。這造成 PNG 格式並沒有得到廣泛的認知。 PNG 的 10 版本規範於 1996 年 7 月 1 日釋出，後來稱為 RFC 2083 標準，並在 1996 年 10 月 1 日成為 W3C 建議。 PNG 的 11 版本進行了部分小幅修改並增加了三個新的資料塊定義，於 1998 年 12 月 31 日釋出。 PNG 的 12 版本增加了另外一個數據塊，於 1999 年 8 月 11 日釋出。 PNG 現行版本是國際標準（ISO／IEC 159482003），並在 2003 年 11 月 10 日作為 W3C 建議釋出。這個版本與 12 版僅有細微差別。 此外也產生了基於 PNG 的動畫格式：1996 年 6 月提出 PNF（Portable Network Frame）草案，當年 8 月改名為 MNG（Multipleimage 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 乘以 25616777216 種顏色的圖片，色彩豐富度更高，但相對的所佔用的空間也就更大了。 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）。用於 DOSUnix 資料的換行符轉換。 1A 在 DOS 命令列下，用於阻止檔案顯示的檔案結束符。 0A Unix 風格的換行符（LF）。用於 UnixDOS 換行符的轉換。 PNG 定義了兩種型別的資料塊：一種是 PNG 檔案必須包含、讀寫軟體也都必須要支援的關鍵塊（critical chunk）；另一種叫做輔助塊（ancillary chunks），PNG 允許軟體忽略它不認識的附加塊。這種基於資料塊的設計，允許 PNG 格式在擴充套件時仍能保持與舊版本相容。 資料塊結構 PNG 檔案中，每個資料塊都由四個部分組成，如下 名稱 位元組數 說明 長度 Length 4 位元組 指定資料塊中資料區域的長度，長度不可超過 2311 個位元組 資料塊型別碼 Chunk Type Code 4 位元組 資料塊型別碼由 ASCII 字母 AZ 和 az 組成的 資料塊符號 資料塊資料 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 演算法，以獲得更高的壓縮率。 預解析 在這階段中，圖片會做先做些預處理，以利後續壓縮。 每次會處理圖片中某一行的資料，首先經過濾波器 來處理這些資料，每個畫素點在不同通道中（ exRGB）的數值都會經過濾波器運算，然就得出的結果會交由差分處理器來重新計算通道中的數值。 差分處理器會將目前這個畫素點上通道中的數值和之前或之上（EX：左邊上方）畫素點做對比，根據差異進行差分編碼。若是相鄰的畫素點在通道上的數值非常接近，就會得出很多 101 這種很小的值。 整個 prediction 階段要做的事就是找到適合的差分編碼器，使得最終差分編碼的結果盡可能的都是重複很小或是零的值，這一階段的結果會影響到 Compression 階段中能實現的壓縮率。 壓縮 經過預解析階段之後，將編碼出的結果輸出給 Deflate（是一種無損資料壓縮演算法，同時使用了 LZ77 和 Huffman Coding 方法），由其執行真正的壓縮操作，在此階段會透過 LZ77 和 Huffman Coding 方法來對影像進行編碼，最後將處理後的圖片結果儲存。最終的壓縮率主要受到兩方面的影響 預解析階段的處理結果：對於 RGB 通道數值相近的畫素區域，也就是編碼結果有很多零值的區域，在壓縮階段得當的壓縮率會特別高，若是相鄰區域的顏色差異大，則壓縮效果就會大打折扣。 Deflate 每一行的匹配情形：在整個壓縮處理過程中都是以行為單位來進行處理。而在處裡資料的過程中，處裡的符號數被限制在 3－258 之間，換言之，最高的壓縮率可以達到 10321，當出現的符號數小於 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 編碼一次不會造成明顯的影像失真。 與 JPEGLS 相比 是一個 幾乎 無失真壓縮格式，相對於上面提到的有損 JPEG 壓縮，它的知名度不高。它可以直接和 PNG 相比較，使用一組標準的測試影像。在 Waterloo Repertoire ColorSet（一組標準測試影像）下，JPEGLS 通常表現要比 PNG 好 1015，但其中有一些影像 PNG 表現明顯更好一些，大約 5075。所以，如果這兩種格式都支援而且對影像檔案大小很敏感的話，可以用這兩種格式都試試，和影像資料本身有比較大關係。 與 TIFF 相比 TIFF 是一個相當多方案結合的格式。它廣泛用作專業影像編輯軟體之間影像交換的中間格式，因此它不斷支援更多應用程式所需的功能，而對應用程式不關心的影像操作部分支援不多。這也意味著許多應用程式只能識別 TIFF 的一個子集，而產生更多的潛在混淆之處。 TIFF 使用的最通用的無失真壓縮演算法是 LZW。這種演算法在 GIF 中也在使用，直到 2003 年一直在專利保護之中。有一種 TIFF 變種使用與 PNG 相同的壓縮演算法，但是沒有獲許多專利程式所支援。TIFF 也提供了一種特殊的無失真壓縮演算法，類似 CCITT Group IV，可以對二值影像（比如傳真或黑白文字）比 PNG 有更好的壓縮效果。 PNG 只支援非自左乘 α，而 TIFF 也支援聯合（自左乘）α。 PNG 規範中不包含嵌入式 EXIF（可交換影像檔案格式）影像資料的標準，比如 zhcn 數碼像機；zhtw 數位相機 拍得的影像。而 TIFF，JPEG 2000 DNG 都支援 EXIF。 早期的瀏覽器不支援 PNG 影像；JPEG 和 GIF 是主流影像格式。由於 GIF 的顏色深度限制，網頁中的有顏色過渡的影像都是使用 JPEG。不管怎樣，JPEG 壓縮都會導致影像的輕微模糊。而 PNG 可以做到在相應顏色深度下的儘可能精確，同時保持影像檔案不大。PNG 已經漸漸成為一種對於小的梯度影像的較好的選擇，眾多瀏覽器都已經對 PNG 有了很好的支援。 參考文獻 外部連結 PNG 檔案格式 PNG 規範第二版，2003 年 11 月 10 日 W3C 建議 PNG 規範最新版 PNG 官方站 PNG 的故事 Category 圖形檔案格式 CategoryISO 標準 CategoryW3C 標準