發展歷史
1995年早期,Unisys公司根據它在GIF格式中使用的LZW數據壓縮算法的軟體專利開始商業收費,為避免專利影響,用於表現單張圖像的PNG、用於表現動畫的MNG圖形檔案格式被同時創建出來。1999年8月,Unisys公司進一步中止了對自由軟體和非商用軟體開發者的GIF專利免費許可,從而使PNG格式獲得了更多的關注。在PNG傳播過程中,很多網路瀏覽器經過很長時間才開始完全支持PNG格式,如MicrosoftWindows默認的InternetExplorer瀏覽器一直到7.0版才支持PNG格式中的半透明效果,較早期的版本(如6.0SP1)需要下載Hotfix或由網站提供額外的Script去支持,這造成PNG格式並沒有得到廣泛的認知。
1996年6月提出PNF(PortableNetworkFrame)草案,當年8月改名為MNG(Multiple-imageNetworkGraphics)。
PNG的1.0版本規範於1996年7月1日發布,後來被稱為RFC2083標準,並在1996年10月1日成為W3C建議。
PNG的1.1版本進行了部分小幅修改並增加了三個新的數據塊定義,於1998年12月31日發布。
PNG的1.2版本增加了另外一個數據塊,於1999年8月11日發布。
PNG現行版本是國際標準(ISO/IEC15948:2003),並在2003年11月10日作為W3C建議發布。這個版本與1.2版僅有細微差別。
2004年末,PNG的動畫擴展——APNG,被提出來。這是一個相對於MNG更簡單的動畫實現方案,不識別APNG格式的PNG解碼器至少能夠正常回放第一幅普通PNG畫面。
特性
體積小網路通訊中因受頻寬制約,在保證圖片清晰、逼真的前提下,網頁中不可能大範圍的使用檔案較大的bmp、jpg格式檔案。無損壓縮PNG檔案採用LZ77算法的派生算法進行壓縮,其結果是獲得高的壓縮比,不損失數據。它利用特殊的編碼方法標記重複出現的數據,因而對圖像的顏色沒有影響,也不可能產生顏色的損失,這樣就可以重複保存而不降低圖像質量。
索引彩色模式PNG-8格式與GIF圖像類似,同樣採用8位調色板將RGB彩色圖像轉換為索引彩色圖像。圖像中保存的不再是各個像素的彩色信息,而是從圖像中挑選出來的具有代表性的顏色編號,每一編號對應一種顏色,圖像的數據量也因此減少,這對彩色圖像的傳播非常有利。
更最佳化的網路傳輸顯示PNG圖像在瀏覽器上採用流式瀏覽,即使經過交錯處理的圖像會在完全下載之前提供瀏覽者一個基本的圖像內容,然後再逐漸清晰起來。它允許連續讀出和寫入圖像數據,這個特性很適合於在通信過程中顯示和生成圖像。
支持透明效果PNG可以為原圖像定義256個透明層次,使得彩色圖像的邊緣能與任何背景平滑地融合,從而徹底地消除鋸齒邊緣。這種功能是GIF和JPEG沒有的。
PNG同時還支持真彩和灰度級圖像的Alpha通道透明度。
檔案結構
PNG圖像格式檔案(或者稱為數據流)由一個8位元組的PNG檔案署名(PNGfilesignature)域和按照特定結構組織的3個以上的數據塊(chunk)組成。檔案署名域
8位元組的PNG檔案署名域用來識別該檔案是不是PNG檔案。該域的值是:
十進制數13780787113102610
十六進制數89504e470d0a1a0a
數據塊類型碼命名約定
輔助位:第一個位元組的第5位是0(大寫)=關鍵,1(小寫)=輔助。一個解碼器遇到一個未知的塊中,輔助位為1可以放心地忽略塊,並繼續顯示圖像。
私人位:第二個位元組的第5位是0(大寫)=公用,1(小寫)=私人。應用程式也可以定義私有(未註冊)塊為自己的目的。需要注意的是解碼器並不需要測試私有財產塊位,因為它沒有功能上的意義,它只是一個行政上的便利,以確保公共和私人塊名稱不會衝突。
保留位:第三個位元組的第5位必須為0(大寫)。該塊名稱的第三個字母的情況下的意義是為將來可能的擴展保留。
安全拷貝位:第4個位元組的第5位是0(大寫)=不安全複製,1(小寫)=安全的複製。最後一個位元組的第5位為0(大寫),表示依賴於圖像數據,如果修改了關鍵數據塊,就不要輸出到新的png檔案中,當然你可以選擇輸出適當修改後的版本。png編輯器可以複製無法識別的塊,也可以不複製,所以輔助數據塊千萬不要依賴於其他數據塊。關於安全拷貝位的原文:
Ifachunk'ssafe-to-copybitis1,thechunkmaybecopiedtoamodifiedPNGdatastreamwhetherornotthePNGeditorrecognizesthechunktype,andregardlessoftheextentofthedatastreammodifications.
Ifachunk'ssafe-to-copybitis0,itindicatesthatthechunkdependsontheimagedata.Iftheprogramhasmadeanychangestocriticalchunks,includingaddition,modification,deletion,orreorderingofcriticalchunks,thenunrecognizedunsafechunksshallnotbecopiedtotheoutputPNGdatastream.(Ofcourse,iftheprogramdoesrecognizethechunk,itcanchoosetooutputanappropriatelymodifiedversion.)
APNGeditorisalwaysallowedtocopyallunrecognizedancillarychunksifithasonlyadded,deleted,modified,orreorderedancillarychunks.Thisimpliesthatitisnotpermissibleforancillarychunkstodependonotherancillarychunks.
PNGeditorsshallterminateonencounteringanunrecognizedcriticalchunktype,becausethereisnowaytobecertainthatavaliddatastreamwillresultfrommodifyingadatastreamcontainingsuchachunk.(Simplydiscardingthechunkisnotgoodenough,becauseitmighthaveunknownimplicationsfortheinterpretationofotherchunks.)Thesafe/unsafemechanismisintendedforusewithancillarychunks.Thesafe-to-copybitwillalwaysbe0forcriticalchunks.
數據塊結構
PNG定義了兩種類型的數據塊,一種是稱為關鍵數據塊(criticalchunk),這是標準的數據塊,另一種叫做輔助數據塊(ancillarychunks),這是可選的數據塊。關鍵數據塊定義了4個標準數據塊,每個PNG檔案都必須包含它們,PNG讀寫軟體也都必須要支持這些數據塊。雖然PNG檔案規範沒有要求PNG編解碼器對可選數據塊進行編碼和解碼,但規範提倡支持可選數據塊。
每個數據塊都由表6-07所示的的4個域組成:
名稱 | 位元組數 | 說明 |
Length(長度) | 4位元組 | 指定數據塊中數據域的長度,其長度不超過 (2 31-1)位元組 |
Chunk Type Code(數據塊類型碼) | 4位元組 | 數據塊類型碼由ASCII字母(A-Z和a-z)組成 |
Chunk Data(數據塊數據) | 可變長度 | 存儲按照Chunk Type Code指定的數據 |
CRC(循環冗餘檢測) | 4位元組 | 存儲用來檢測是否有錯誤的循環冗餘碼 |
一個4位元組的無符號整數,給出位元組的數據塊的數據欄位的數量。長度只計算數據欄位,為了兼容一些不支持無符號的語言,所以不是(2^32-1)。
數據塊類型碼
一個4位元組的塊類型代碼。為了便於描述和檢查PNG檔案,類型代碼僅限於包括大寫和小寫的ASCII字母(A-Z和a-z或65-90和97-122十進制)。然而,編碼器和解碼器必須把代碼作為固定的二進制值,而不是字元串。
數據塊
數據塊的數據位元組,以適當的組塊的類型,如果有的話。該欄位可以是長度為零。
循環冗餘檢測
一個4位元組的CRC(循環冗餘校驗)計算,在所述塊的前面的位元組,包括該塊類型的代碼和數據塊的數據欄位,但是不包括長度欄位。CRC是始終存在,甚至不包含數據塊
表中,CRC(cyclicredundancycheck)域中的值是對ChunkTypeCode域和ChunkData域中的數據進行計算得到的。CRC具體算法定義在ISO3309和ITU-TV.42中,其值按下面的CRC碼生成多項式進行計算:
x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1關鍵數據塊
PNG檔案格式中的數據塊 | ||||
數據塊符號 | 數據塊名稱 | 多數據塊 | 可選否 | 位置限制 |
IHDR | 檔案頭數據塊 | 否 | 否 | 第一塊 |
PLTE | 調色板數據塊 | 否 | 是 | 在IDAT之前 |
IDAT | 圖像數據塊 | 是 | 否 | 與其他IDAT連續 |
IEND | 圖像結束數據 | 否 | 否 | 最後一個數據塊 |
檔案頭數據塊IHDR(headerchunk):它包含有PNG檔案中存儲的圖像數據的基本信息,並要作為第一個數據塊出現在PNG數據流中,而且一個PNG數據流中只能有一個檔案頭數據塊。
域的名稱 | 位元組數 | 說明 |
Width | 4 bytes | 圖像寬度,以像素為單位 |
Height | 4 bytes | 圖像高度,以像素為單位 |
Bit depth | 1 byte | 圖像深度:索引彩色圖像:1,2,4或8灰度圖像:1,2,4,8或16真彩色圖像:8或16 |
ColorType | 1 byte | 顏色類型:0:灰度圖像, 1,2,4,8或162:真彩色圖像,8或163:索引彩色圖像,1,2,4或84:帶α通道數據的灰度圖像,8或166:帶α通道數據的真彩色圖像,8或16 |
Compression method | 1 byte | 壓縮方法(LZ77派生算法) |
Filter method | 1 byte | 濾波器方法 |
Interlace method | 1 byte | 隔行掃描方法:0:非隔行掃描(逐行掃描)1: Adam7(由Adam M. Costello開發的7遍隔行掃描方法) |
調色板數據塊PLTE(palettechunk)包含有與索引彩色圖像(indexed-colorimage)相關的彩色變換數據,它僅與索引彩色圖像有關,而且要放在圖像數據塊(imagedatachunk)之前。
PLTE數據塊是定義圖像的調色板信息,PLTE可以包含1~256個調色板信息,每一個調色板信息由3個位元組組成:
顏色 | 位元組 | 意義 |
Red | 1 byte | 0 = 黑色, 255 = 紅 |
Green | 1 byte | 0 = 黑色, 255 = 綠色 |
Blue | 1 byte | 0 = 黑色, 255 = 藍色 |
對於索引圖像,調色板信息是必須的,調色板的顏色索引從0開始編號,然後是1、2……,調色板的顏色數不能超過色深中規定的顏色數(如圖像色深為4的時候,調色板中的顏色數不可以超過2^4=16),否則,這將導致PNG圖像不合法.
真彩色圖像和帶α通道數據的真彩色圖像也可以有調色板數據塊,目的是便於非真彩色顯示程式用它來量化圖像數據,從而顯示該圖像.
DAT
圖像數據塊IDAT(image data chunk):它存儲實際的數據,在數據流中可包含多個連續順序的圖像數據塊。IDAT存放著圖像真正的數據信息,因此,如果能夠了解IDAT的結構,我們就可以很方便的生成PNG圖像。
IEND
圖像結束數據IEND(image trailer chunk):它用來標記PNG檔案或者數據流已經結束,並且必須要放在檔案的尾部。如果我們仔細觀察PNG檔案,我們會發現,檔案的結尾12個字元看起來總應該是這樣的:PNG檔案結構0000000049454E44AE426082不難明白,由於數據塊結構的定義,IEND數據塊的長度總是0(00 00 00 00,除非人為加入信息),數據標識總是IEND(49 45 4E 44),因此,CRC碼也總是AE 42 60 82。輔助數據塊
PNG檔案格式中的數據塊 | ||||
數據塊符號 | 數據塊名稱 | 多數據塊 | 可選否 | 位置限制 |
cHRM | 基色和白色點數據塊 | 否 | 是 | 在PLTE和IDAT之前 |
gAMA | 圖像γ數據塊 | 否 | 是 | 在PLTE和IDAT之前 |
sBIT | 樣本有效位數據塊 | 否 | 是 | 在PLTE和IDAT之前 |
bKGD | 背景顏色數據塊 | 否 | 是 | 在PLTE之後IDAT之前 |
hIST | 圖像直方圖數據塊 | 否 | 是 | 在PLTE之後IDAT之前 |
tRNS | 圖像透明數據塊 | 否 | 是 | 在PLTE之後IDAT之前 |
oFFs | (專用公共數據塊) |
格式
PNG格式有8位、24位、32位三種形式,其中8位PNG支持兩種不同的透明形式(索引透明和alpha透明),24位PNG不支持透明,32位PNG在24位基礎上增加了8位透明通道,因此可展現256級透明程度。PNG8和PNG24後面的數字則是代表這種PNG格式最多可以索引和存儲的顏色值。”8″代表2的8次方也就是256色,而24則代表2的24次方大概有1600多萬色。
格式 | 最高支持色彩通道 | 索引色編輯支持 | 透明支持 |
PNG8 | 256索引色 | 支持 | 支持設定特定索引色為透明色(布爾透明) 支持為索引色附加8位透明度(256階alpha透明) |
PNG24 | 約1600萬色 | 不支持 | 不支持 |
PNG32 | 約1600萬色 | 不支持 | 支持8位透明度(256階alpha透明) |