PNG是20世紀(jì)90年代中期開始開發(fā)的圖像文件存儲格式,其目的是企圖替代GIF和TIFF文件格式,同時增加一些GIF文件格式所不具備的特性。流式網(wǎng)絡(luò)圖形格式(Portable Network Graphic Format,PNG)名稱來源于非官方的“PNG's Not GIF”,是一種位圖文件(bitmap file)存儲格式,讀成“ping”。PNG用來存儲灰度圖像時,灰度圖像的深度可多到16位,存儲彩色圖像時,彩色圖像的深度可多到48位,并且還可存儲多到16位的α通道數(shù)據(jù)。PNG使用從LZ77派生的無損數(shù)據(jù)壓縮算法。

PNG文件格式保留GIF文件格式的下列特性:

  1. 使用彩色查找表或者叫做調(diào)色板可支持256種顏色的彩色圖像。
  2. 流式讀/寫性能(streamability):圖像文件格式允許連續(xù)讀出和寫入圖像數(shù)據(jù),這個特性很適合于在通信過程中生成和顯示圖像。
  3. 逐次逼近顯示(progressive display):這種特性可使在通信鏈路上傳輸圖像文件的同時就在終端上顯示圖像,把整個輪廓顯示出來之后逐步顯示圖像的細(xì)節(jié),也就是先用低分辨率顯示圖像,然后逐步提高它的分辨率。
  4. 透明性(transparency):這個性能可使圖像中某些部分不顯示出來,用來創(chuàng)建一些有特色的圖像。
  5. 輔助信息(ancillary information):這個特性可用來在圖像文件中存儲一些文本注釋信息。
  6. 獨立于計算機軟硬件環(huán)境。
  7. 使用無損壓縮。

PNG文件格式中要增加下列GIF文件格式所沒有的特性:

  1. 每個像素為48位的真彩色圖像。
  2. 每個像素為16位的灰度圖像。
  3. 可為灰度圖和真彩色圖添加α通道。
  4. 添加圖像的γ信息。
  5. 使用循環(huán)冗余碼(cyclic redundancy code,CRC)檢測損害的文件。
  6. 加快圖像顯示的逐次逼近顯示方式。
  7. 標(biāo)準(zhǔn)的讀/寫工具包。
  8. 可在一個文件中存儲多幅圖像。

文件結(jié)構(gòu)

PNG圖像格式文件(或者稱為數(shù)據(jù)流)由一個8字節(jié)的PNG文件署名(PNG file signature)域和按照特定結(jié)構(gòu)組織的3個以上的數(shù)據(jù)塊(chunk)組成。

PNG定義了兩種類型的數(shù)據(jù)塊,一種是稱為關(guān)鍵數(shù)據(jù)塊(critical chunk),這是標(biāo)準(zhǔn)的數(shù)據(jù)塊,另一種叫做輔助數(shù)據(jù)塊(ancillary chunks),這是可選的數(shù)據(jù)塊。關(guān)鍵數(shù)據(jù)塊定義了4個標(biāo)準(zhǔn)數(shù)據(jù)塊,每個PNG文件都必須包含它們,PNG讀寫軟件也都必須要支持這些數(shù)據(jù)塊。雖然PNG文件規(guī)范沒有要求PNG編譯碼器對可選數(shù)據(jù)塊進行編碼和譯碼,但規(guī)范提倡支持可選數(shù)據(jù)塊。

(1) PNG文件署名域

8字節(jié)的PNG文件署名域用來識別該文件是不是PNG文件。該域的值是:

十進制數(shù) 137 80 78 71 13 10 26 10
十六進制數(shù) 89 50 4e 47 0d 0a 1a 0a

 

(2) 數(shù)據(jù)塊的結(jié)構(gòu)

每個數(shù)據(jù)塊都由表6-07所示的的4個域組成。

表6-07 PNG文件數(shù)據(jù)塊的結(jié)構(gòu)

名稱

字節(jié)數(shù)

說明

Length(長度) 4字節(jié) 指定數(shù)據(jù)塊中數(shù)據(jù)域的長度,其長度不超過
(231-1)字節(jié)
Chunk Type Code(數(shù)據(jù)塊類型碼) 4字節(jié) 數(shù)據(jù)塊類型碼由ASCII字母(A-Z和a-z)組成
Chunk Data(數(shù)據(jù)塊數(shù)據(jù)) 可變長度 存儲按照Chunk Type Code指定的數(shù)據(jù)
CRC(循環(huán)冗余檢測) 4字節(jié) 存儲用來檢測是否有錯誤的循環(huán)冗余碼

 

在表6-07中,CRC(cyclic redundancy check)域中的值是對Chunk Type Code域和Chunk Data域中的數(shù)據(jù)進行計算得到的。CRC具體算法定義在ISO 3309和ITU-T V.42中,其值按下面的CRC碼生成多項式進行計算:

x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1

數(shù)據(jù)塊結(jié)構(gòu)

1. 關(guān)鍵數(shù)據(jù)塊

關(guān)鍵數(shù)據(jù)塊中的4個標(biāo)準(zhǔn)數(shù)據(jù)塊是:

(1) 文件頭數(shù)據(jù)塊IHDR(header chunk):它包含有PNG文件中存儲的圖像數(shù)據(jù)的基本信息,并要作為第一個數(shù)據(jù)塊出現(xiàn)在PNG數(shù)據(jù)流中,而且一個PNG數(shù)據(jù)流中只能有一個文件頭數(shù)據(jù)塊。

文件頭數(shù)據(jù)塊由13字節(jié)組成,它的格式如表6-08所示。

表6-08 PNG文件頭鍵數(shù)據(jù)塊的結(jié)構(gòu)

域的名稱

字節(jié)數(shù)

說明

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:帶α通道數(shù)據(jù)的灰度圖像,8或16
6:帶α通道數(shù)據(jù)的真彩色圖像,8或16

Compression method 1 byte 壓縮方法(LZ77派生算法)
Filter method 1 byte 濾波器方法
Interlace method 1 byte 隔行掃描方法:

0:非隔行掃描

1: Adam7(由Adam M. Costello開發(fā)的7
遍隔行掃描方法)

 

(2) 調(diào)色板數(shù)據(jù)塊PLTE(palette chunk):它包含有與索引彩色圖像((indexed-color image))相關(guān)的彩色變換數(shù)據(jù),它僅與索引彩色圖像有關(guān),而且要放在圖像數(shù)據(jù)塊(image data chunk)之前。真彩色的PNG數(shù)據(jù)流也可以有調(diào)色板數(shù)據(jù)塊,目的是便于非真彩色顯示程序用它來量化圖像數(shù)據(jù),從而顯示該圖像。調(diào)色板數(shù)據(jù)塊結(jié)構(gòu)如表6-09所示。

表6-09 調(diào)色板數(shù)據(jù)塊結(jié)構(gòu)

域的名稱

字節(jié)數(shù)

說明

Red 1 byte 0 = 黑,255 = 紅
Green ">

0 = 黑,255 = 綠

Blue 1 byte 0 = 黑,255 = 藍(lán)

 

調(diào)色板實際是一個彩色索引查找表,它的表項數(shù)目可以是1~256中的一個數(shù),每個表項有3字節(jié),因此調(diào)色板數(shù)據(jù)塊所包含的最大字節(jié)數(shù)為768。

(3) 圖像數(shù)據(jù)塊IDAT(image data chunk):它存儲實際的數(shù)據(jù),在數(shù)據(jù)流中可包含多個連續(xù)順序的圖像數(shù)據(jù)塊。

(4) 圖像結(jié)束數(shù)據(jù)IEND(image trailer chunk):它用來標(biāo)記PNG文件或者數(shù)據(jù)流已經(jīng)結(jié)束,并且必須要放在文件的尾部。

除了表示數(shù)據(jù)塊開始的IHDR必須放在最前面, 表示PNG文件結(jié)束的IEND數(shù)據(jù)塊放在最后面之外,其他數(shù)據(jù)塊的存放順序沒有限制。

2. 輔助數(shù)據(jù)塊

PNG文件格式規(guī)范制定的10個輔助數(shù)據(jù)塊是:

(1) 背景顏色數(shù)據(jù)塊bKGD(background color)。

(2) 基色和白色度數(shù)據(jù)塊cHRM(primary chromaticities and white point)。所謂白色度是指當(dāng)R=G=B=最大值時在顯示器上產(chǎn)生的白色度。

(3) 圖像γ數(shù)據(jù)塊gAMA(image gamma)。

(4) 圖像直方圖數(shù)據(jù)塊hIST(image histogram)。

(5) 物理像素尺寸數(shù)據(jù)塊pHYs(physical pixel dimensions)。

(6) 樣本有效位數(shù)據(jù)塊sBIT(significant bits)。

(7) 文本信息數(shù)據(jù)塊tEXt(textual data)。

(8) 圖像最后修改時間數(shù)據(jù)塊tIME (image last-modification time)。

(9) 圖像透明數(shù)據(jù)塊tRNS (transparency)。

(10) 壓縮文本數(shù)據(jù)塊zTXt (compressed textual data)。

3. 數(shù)據(jù)塊摘要

關(guān)鍵數(shù)據(jù)塊、輔助數(shù)據(jù)塊和專用公共數(shù)據(jù)塊(special-purpose public chunks)綜合在表6-10中。

表6-10 PNG文件格式中的數(shù)據(jù)塊

數(shù)據(jù)塊符號

數(shù)據(jù)塊名稱

多數(shù)據(jù)塊

可選否

位置限制

IHDR 文件頭數(shù)據(jù)塊

第一塊
cHRM 基色和白色點數(shù)據(jù)塊

在PLTE和IDAT之前
gAMA 圖像γ數(shù)據(jù)塊

在PLTE和IDAT之前
sBIT 樣本有效位數(shù)據(jù)塊

在PLTE和IDAT之前
PLTE 調(diào)色板數(shù)據(jù)塊

在IDAT之前
bKGD 背景顏色數(shù)據(jù)塊

在PLTE之后IDAT之前
hIST 圖像直方圖數(shù)據(jù)塊

在PLTE之后IDAT之前
tRNS 圖像透明數(shù)據(jù)塊

在PLTE之后IDAT之前
oFFs (專用公共數(shù)據(jù)塊)

在IDAT之前
pHYs 物理像素尺寸數(shù)據(jù)塊

在IDAT之前
sCAL (專用公共數(shù)據(jù)塊)

在IDAT之前
IDAT 圖像數(shù)據(jù)塊

與其他IDAT連續(xù)
tIME 圖像最后修改時間數(shù)據(jù)塊

無限制
tEXt 文本信息數(shù)據(jù)塊

無限制
zTXt 壓縮文本數(shù)據(jù)塊

無限制
fRAc (專用公共數(shù)據(jù)塊)

無限制
gIFg (專用公共數(shù)據(jù)塊)

無限制
gIFt (專用公共數(shù)據(jù)塊)

無限制
gIFx (專用公共數(shù)據(jù)塊)

無限制
IEND 圖像結(jié)束數(shù)據(jù)

最后一個數(shù)據(jù)塊

 

tEXt和zTXt數(shù)據(jù)塊中的標(biāo)準(zhǔn)關(guān)鍵字:

Title

圖像名稱或者標(biāo)題

Author

圖像作者名

Description

圖像說明

Copyright

版權(quán)聲明

CreationTime

原圖創(chuàng)作時間

Software

創(chuàng)作圖像使用的軟件

Disclaimer

棄權(quán)

Warning

圖像內(nèi)容警告

Source

創(chuàng)作圖像使用的設(shè)備

Comment

各種注釋

 轉(zhuǎn)自http://dev.gameres.com/Program/Visual/Other/PNGFormat.htm