PNG是20世紀90年代中期開始開發的圖像文件存儲格式,其目的是企圖替代GIF和TIFF文件格式,同時增長一些GIF文件格式所不具有的特性。流式網絡圖形格式(Portable Network Graphic Format,PNG)名稱來源於非官方的「PNG's Not GIF」,是一種位圖文件(bitmap file)存儲格式,讀成「ping」。PNG用來存儲灰度圖像時,灰度圖像的深度可多到16位,存儲彩色圖像時,彩色圖像的深度可多到48位,而且還可存儲多到16位的α通道數據。PNG使用從LZ77派生的無損數據壓縮算法。算法
PNG文件格式保留GIF文件格式的下列特性:網絡
PNG文件格式中要增長下列GIF文件格式所沒有的特性:工具
文件結構性能
PNG圖像格式文件(或者稱爲數據流)由一個8字節的PNG文件署名(PNG file signature)域和按照特定結構組織的3個以上的數據塊(chunk)組成。編碼
PNG定義了兩種類型的數據塊,一種是稱爲關鍵數據塊(critical chunk),這是標準的數據塊,另外一種叫作輔助數據塊(ancillary chunks),這是可選的數據塊。關鍵數據塊定義了4個標準數據塊,每一個PNG文件都必須包含它們,PNG讀寫軟件也都必需要支持這些數據塊。雖然PNG文件規範沒有要求PNG編譯碼器對可選數據塊進行編碼和譯碼,但規範提倡支持可選數據塊。spa
(1) PNG文件署名域orm
8字節的PNG文件署名域用來識別該文件是否是PNG文件。該域的值是:索引
十進制數 | 137 | 80 | 78 | 71 | 13 | 10 | 26 | 10 |
十六進制數 | 89 | 50 | 4e | 47 | 0d | 0a | 1a | 0a |
(2) 數據塊的結構ip
每一個數據塊都由表6-07所示的的4個域組成。ci
表6-07 PNG文件數據塊的結構
名稱 |
字節數 |
說明 |
Length(長度) | 4字節 | 指定數據塊中數據域的長度,其長度不超過 (231-1)字節 |
Chunk Type Code(數據塊類型碼) | 4字節 | 數據塊類型碼由ASCII字母(A-Z和a-z)組成 |
Chunk Data(數據塊數據) | 可變長度 | 存儲按照Chunk Type Code指定的數據 |
CRC(循環冗餘檢測) | 4字節 | 存儲用來檢測是否有錯誤的循環冗餘碼 |
在表6-07中,CRC(cyclic redundancy check)域中的值是對Chunk Type Code域和Chunk Data域中的數據進行計算獲得的。CRC具體算法定義在ISO 3309和ITU-T V.42中,其值按下面的CRC碼生成多項式進行計算:
x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
數據塊結構
1. 關鍵數據塊
關鍵數據塊中的4個標準數據塊是:
(1) 文件頭數據塊IHDR(header chunk):它包含有PNG文件中存儲的圖像數據的基本信息,並要做爲第一個數據塊出如今PNG數據流中,並且一個PNG數據流中只能有一個文件頭數據塊。
文件頭數據塊由13字節組成,它的格式如表6-08所示。
表6-08 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或16 2:真彩色圖像,8或16 3:索引彩色圖像,1,2,4或8 4:帶α通道數據的灰度圖像,8或16 |
Compression method | 1 byte | 壓縮方法(LZ77派生算法) |
Filter method | 1 byte | 濾波器方法 |
Interlace method | 1 byte | 隔行掃描方法: 0:非隔行掃描 1: Adam7(由Adam M. Costello開發的7 |
(2) 調色板數據塊PLTE(palette chunk):它包含有與索引彩色圖像((indexed-color image))相關的彩色變換數據,它僅與索引彩色圖像有關,並且要放在圖像數據塊(image data chunk)以前。真彩色的PNG數據流也能夠有調色板數據塊,目的是便於非真彩色顯示程序用它來量化圖像數據,從而顯示該圖像。調色板數據塊結構如表6-09所示。
表6-09 調色板數據塊結構
域的名稱 |
字節數 |
說明 |
Red | 1 byte | 0 = 黑,255 = 紅 |
Green | "> 0 = 黑,255 = 綠 |
|
Blue | 1 byte | 0 = 黑,255 = 藍 |
調色板實際是一個彩色索引查找表,它的表項數目能夠是1~256中的一個數,每一個表項有3字節,所以調色板數據塊所包含的最大字節數爲768。
(3) 圖像數據塊IDAT(image data chunk):它存儲實際的數據,在數據流中可包含多個連續順序的圖像數據塊。
(4) 圖像結束數據IEND(image trailer chunk):它用來標記PNG文件或者數據流已經結束,而且必需要放在文件的尾部。
除了表示數據塊開始的IHDR必須放在最前面, 表示PNG文件結束的IEND數據塊放在最後面以外,其餘數據塊的存放順序沒有限制。
2. 輔助數據塊
PNG文件格式規範制定的10個輔助數據塊是:
(1) 背景顏色數據塊bKGD(background color)。
(2) 基色和白色度數據塊cHRM(primary chromaticities and white point)。所謂白色度是指當R=G=B=最大值時在顯示器上產生的白色度。
(3) 圖像γ數據塊gAMA(image gamma)。
(4) 圖像直方圖數據塊hIST(image histogram)。
(5) 物理像素尺寸數據塊pHYs(physical pixel dimensions)。
(6) 樣本有效位數據塊sBIT(significant bits)。
(7) 文本信息數據塊tEXt(textual data)。
(8) 圖像最後修改時間數據塊tIME (image last-modification time)。
(9) 圖像透明數據塊tRNS (transparency)。
(10) 壓縮文本數據塊zTXt (compressed textual data)。
3. 數據塊摘要
關鍵數據塊、輔助數據塊和專用公共數據塊(special-purpose public chunks)綜合在表6-10中。
表6-10 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 | 圖像結束數據 | 否 |
否 |
最後一個數據塊 |
tEXt和zTXt數據塊中的標準關鍵字:
Title |
圖像名稱或者標題 |
Author |
圖像做者名 |
Description |
圖像說明 |
Copyright |
版權聲明 |
CreationTime |
原圖創做時間 |
Software |
創做圖像使用的軟件 |
Disclaimer |
棄權 |
Warning |
圖像內容警告 |
Source |
創做圖像使用的設備 |
Comment |
各類註釋 |