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

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

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

PNG文件格式中要增加下列GIF文件格式所沒(méi)有的特性:

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

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

PNG圖像格式文件(或者稱為數(shù)據(jù)流)由一個(gè)8字節(jié)的PNG文件署名(PNG file signature)域和按照特定結(jié)構(gòu)組織的3個(gè)以上的數(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個(gè)標(biāo)準(zhǔn)數(shù)據(jù)塊,每個(gè)PNG文件都必須包含它們,PNG讀寫軟件也都必須要支持這些數(shù)據(jù)塊。雖然PNG文件規(guī)范沒(méi)有要求PNG編譯碼器對(duì)可選數(shù)據(jù)塊進(jìn)行編碼和譯碼,但規(guī)范提倡支持可選數(shù)據(jù)塊。

(1) PNG文件署名域

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

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

 

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

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

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

名稱

字節(jié)數(shù)

說(shuō)明

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

 

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

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個(gè)標(biāo)準(zhǔn)數(shù)據(jù)塊是:

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

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

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

域的名稱

字節(jié)數(shù)

說(shuō)明

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ù)塊,目的是便于非真彩色顯示程序用它來(lái)量化圖像數(shù)據(jù),從而顯示該圖像。調(diào)色板數(shù)據(jù)塊結(jié)構(gòu)如表6-09所示。

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

域的名稱

字節(jié)數(shù)

說(shuō)明

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

0 = 黑,255 = 綠

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

 

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

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

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

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

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

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

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

(2) 基色和白色度數(shù)據(jù)塊cHRM(primary chromaticities and white point)。所謂白色度是指當(dāng)R=G=B=最大值時(shí)在顯示器上產(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í)間數(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ù)塊符號(hào)

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

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

可選否

位置限制

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

第一塊
cHRM 基色和白色點(diǎn)數(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í)間數(shù)據(jù)塊

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

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

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

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

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

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

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

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

 

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

Title

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

Author

圖像作者名

Description

圖像說(shuō)明

Copyright

版權(quán)聲明

CreationTime

原圖創(chuàng)作時(shí)間

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