PNG是20世紀90年代中期開始開發的影像檔儲存格式,其目的是企圖替代GIF和TIFF檔案格式,同
時增加一些GIF檔案格式所不具備的特性。流式網狀圖形格式(Portable Network Graphic Format,PNG
)名稱來源於非官方的“PNG's Not GIF”,是一種位元影像檔案(bitmap file)儲存格式,讀成“ping”。P
NG用來儲存灰階映像時,灰階映像的深度可多到16位,儲存彩色映像時,彩色映像的深度可多到48位,
並且還可儲存多到16位的α通道資料。PNG使用從LZ77派生的無損資料壓縮演算法。
一、資料結構
1.PNG資料區塊
PNG定義了兩種類型的資料區塊,一種是稱為關鍵資料區塊,這是標準的資料區塊,另一種叫做輔助資料
塊,這是可選的資料區塊。關鍵資料區塊定義了5個標準資料區塊,每個PNG檔案都必須包含它們,PNG讀寫軟
件也必須要支援這些資料區塊。至於可選資料區塊,規範只是提倡予以支援。
下表就是PNG中資料區塊的類別,其中 * 號表示關鍵資料區塊:
----------------------------------------------------------------
資料區塊符號 資料區塊名稱 多資料區塊 可選否 位置限制
----------------------------------------------------------------
* PNG檔案標識 否 第一塊
IHDR * 檔案頭資料區塊 否 否 第二塊
cHRM 基色和白色點資料區塊 否 是 在PLTE和IDAT之前
gAMA 映像γ資料區塊 否 是 在PLTE和IDAT之前
sBIT 樣本有效位元據塊 否 是 在PLTE和IDAT之前
PLTE * 調色盤資料區塊 否 是 在IDAT之前
bKGD 背景顏色資料區塊 否 是 在PLTE之後IDAT之前
hIST 映像長條圖資料區塊 否 是 在PLTE之後IDAT之前
tRNS 映像透明資料區塊 否 是 在PLTE之後IDAT之前
oFFs (專用公用資料區塊) 否 是 在IDAT之前
pHYs 物理像素尺寸資料區塊 否 是 在IDAT之前
sCAL (專用公用資料區塊) 否 是 在IDAT之前
IDAT * 映像資料區塊 是 否 與其他IDAT連續
tIME 映像最後修改時間 否 是 無限制
tEXt 文本資訊資料區塊 是 是 無限制
zTXt 壓縮文本資料區塊 是 是 無限制
fRAc (專用公用資料區塊) 是 是 無限制
gIFg (專用公用資料區塊) 是 是 無限制
gIFt (專用公用資料區塊) 是 是 無限制
gIFx (專用公用資料區塊) 是 是 無限制
IEND * 映像結束資料區塊 否 否 最後一塊
--------------------------------------------------------------
除了關鍵資料區塊,其它的資料區塊都是可有可無的。
2.資料區塊結構
PNG檔案中,除了PNG檔案標識外,所有的資料區塊均由4個部分組成,如下表:
----------------------------------------------------------------------
順號 名稱 位元組數 說明
----------------------------------------------------------------------
1 長度 4 指定第3部分資料域的長度
2 資料區塊符號 4 由資料區塊符號的 Ascii 碼組成
3 資料域 不定 儲存按照 Chunk Type Code 指定的資料
4 CRC校正 4 又稱迴圈冗餘檢測,用來檢測是否有錯誤
----------------------------------------------------------------------
迴圈冗餘檢測中的值是對第2部分資料區塊符號和第3部分資料域進行計算得到的,具體演算法定義在
ISO 3309 和 ITU-T V.42中,其值按下面的 CRC 碼產生多項式進行計算:
x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
3.5個關鍵資料區塊的具體結構。
①PNG檔案標識
它固定為8個位元組:89 50 4E 47 0D 0A 1A 0A,前4個位元組為“.PNG”的 Ascii 碼。
②檔案頭資料區塊
它包含有 PNG 檔案中儲存的映像資料的基本資料,並要作為第二個資料區塊出現在 PNG 資料流中,
一個 PNG 資料流中只能有一個檔案頭資料區塊。格式如下表所示。
-----------------------------------------------------
網域名稱稱 位元組數 說明
-----------------------------------------------------
資料域長度 4 指定資料域的長度,固定為00 00 00 0D
資料區塊符號 4 49 48 44 52,是“IHDR”的 Ascii 碼
(以下13個位元組是資料域)
映像寬度 4 單位:像素
映像高度 4 單位:像素
色彩深度 1 灰階映像:1、2、4、8 或 16
真彩色映像:8 或 16
索引彩色映像:1、2、4 或 8
帶α通道資料的灰階映像:8 或 16
帶α通道資料的真彩映像:8 或 16
顏色類型 1 灰階映像:0
真彩色映像:2
索引彩色映像:3
帶α通道資料的灰階映像:4
帶α通道資料的真彩色映像:6
壓縮方法 1 規定此位元組為0(使用LZ77派生演算法壓縮)
濾波器方法 1 通常此位元組為0
隔行掃描方法 1 非隔行掃描:0
Adam7(7遍隔行掃描方法):1
CRC校正 4
-----------------------------------------------------
③調色盤資料區塊
包含有與索引彩色映像相關的彩色變換資料,它僅與索引彩色映像有關,而且要放在映像資料區塊之
前。它定義映像的調色盤資訊,其資料結構如下:
----------------------------------------------------------------------
網域名稱稱 位元組數 說明
----------------------------------------------------------------------
資料域長度 4 指定資料域的長度
資料區塊符號 4 50 4C 54 45,是“PLTE”的 Ascii 碼
資料域 不定 n個調色盤,就有3×n個位元組長度,最多 3×256 位元組
CRC校正 4
----------------------------------------------------------------------
每一個調色盤由表示紅、綠、藍資訊的3個位元組組成,因此,調色盤的長度應該是3的倍數,否則
就是非法的調色盤。
對於索引映像,調色盤資訊是必須的,調色盤的色彩索引從0開始編號,然後是1、2……,調色
板的顏色數不能超過檔案頭資料區塊中“色彩深度”規定的顏色數(例像色深為4時,調色盤中的顏
色數不可超過2^4=16),否則將導致 PNG 映像不合法。
真彩色映像和帶α通道資料的真彩色映像可以有調色盤資料區塊,目的是便於非真彩色顯示程式用它
來量化映像資料,從而顯示該映像,也可以不要調色盤。
④映像資料區塊
它儲存實際的資料,在資料流中可包含多個連續順序的映像資料區塊。其資料結構如下:
--------------------------------------------------------
網域名稱稱 位元組數 說明
--------------------------------------------------------
資料域長度 4 指定資料域的長度
資料區塊符號 4 49 44 41 54,是“IDAT”的 Ascii 碼
資料域 不定 存放著映像真正的資料資訊(壓縮的)
CRC校正 4
--------------------------------------------------------
由於映像資料區塊是壓縮資料,如果你能夠掌握壓縮和解壓縮的方法,那麼你就能輕易而舉地將其它
類型的圖片轉換成PNG圖片,或者將PNG圖片轉換成其它類型的圖片。
⑤映像結束塊
它用來標記PNG檔案或者資料流已經結束,必須要放在檔案的尾部。其資料結構如下:
--------------------------------------------------------
網域名稱稱 位元組數 說明
--------------------------------------------------------
資料域長度 4 全為0:00 00 00 00
資料區塊符號 4 49 45 4E 44,是“IEND”的 Ascii 碼
資料域
CRC校正 4 AE 42 60 82
--------------------------------------------------------
二、一個具體的例子
用系統畫圖建立一個8×8像素的映像,填充紅色,另存新檔PNG圖片,該圖片全部資料如下(註:因
裝置差異,你的資料也許會有微小不同):
000000: 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
000010: 00 00 00 08 00 00 00 08 08 02 00 00 00 4B 6D 29
000020: DC 00 00 00 01 73 52 47 42 00 AE CE 1C E9 00 00
000030: 00 04 67 41 4D 41 00 00 B1 8F 0B FC 61 05 00 00
000040: 00 20 63 48 52 4D 00 00 7A 26 00 00 80 84 00 00
000050: FA 00 00 00 80 E8 00 00 75 30 00 00 EA 60 00 00
000060: 3A 98 00 00 17 70 9C BA 51 3C 00 00 00 17 49 44
000070: 41 54 18 57 63 FC CF 80 03 00 25 B0 22 EC A2 20
000080: 63 06 52 07 00 11 99 38 C9 DB F8 06 FD 00 00 00
000090: 00 49 45 4E 44 AE 42 60 82
分析:
000000-000007:這8個位元組為 PNG 檔案標識。
000008-000020:檔案頭資料區塊,其中:
00 00 00 0D:資料域長度為13位元組
49 48 44 52:檔案頭資料區塊符號“IHDR”
00 00 00 08:映像寬8像素
00 00 00 08:映像高8像素
08:24位色彩深度
02:顏色類型為真彩
00:使用壓縮
00:濾波器方法,通常為0
00:非隔行掃描
4B 6D 29 DC:CRC校正碼
000021-00002D:可選資料區塊 sRGB
00002E-00003D:可選資料區塊 gAMA(映像γ資料區塊)
00003E-000069:可選資料區塊 cHRM(基色和白色點資料區塊)
00006A-00008C:IDAT資料區塊,其中:
00 00 00 17:資料域長度為23位元組
49 44 41 54:IDAT資料區塊標識“IDAT”
18 57 63… :壓縮的資料
DB F8 06 FD:CRC校正碼
00008D-000098:IEND資料區塊,如上所說,固定為 00 00 00 00 49 45 4E 44 AE 42 60 82
由於 PNG 中規定除關鍵資料區塊外,其它的輔助資料區塊都為可選的,因此,我們可以用Hex編輯器來
對這些資料做增刪實驗(Hex編輯器:http://bbs.pfan.cn/post-249666.html)
1.為圖片減肥:利用Hex編輯器的刪除功能,刪除000020-000069這3個輔助資料區塊,檔案位元組數由原
來的153位元組縮減到80位元組,而並不影響映像的內容!試試看,你成功了嗎?
但要注意的是,PNG 格式可以儲存映像中的層、文字等資訊,一旦刪除了這些資料後,映像將失去
原來的可編輯性。
2.添加文本資訊:增加這麼一個字串“PNG圖片”,字串的Ascii碼是50 4E 47 CD BC C6 AC,共7
個位元組,所以資料域長度應為00 00 00 07,資料區塊符號是“tEXt”,Ascii是74 45 58 74,至於CRC校
驗碼,我們隨便寫4個位元組,就寫 BA 2D 29 CC 吧!這些資訊全合起來就是:
00 00 00 07 74 45 58 74 50 4E 47 CD BC C6 AC BA 2D 29 CC
共19位元組。由於tEXt資料區塊可以出現在任意資料區塊之間,我們就利用Hex編輯器的插入功能把這19個字
節從000068插入吧,然後另存新檔,再用附件中的代碼開啟它,我們就不禁可以看到映像,還可以看到這
7個字元文本了!