png圖片格式分析
Png 格式分析
現(xiàn)在j2me中能夠用到的圖片格式一般是png。在游戲開發(fā)中,為了得到更好的效果,我們需要對png格式的圖片進(jìn)行處理。下面我就png格式圖片結(jié)構(gòu)進(jìn)行分析。
Png圖片結(jié)構(gòu)
Png格式的圖片一般由一些數(shù)據(jù)塊組成。列表如下:
數(shù)據(jù)塊符號 |
數(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ù)塊 |
否 |
是 |
無限制 |
tEXt |
文本信息數(shù)據(jù)塊 |
是 |
是 |
無限制 |
zTXt |
壓縮文本數(shù)據(jù)塊 |
是 |
是 |
無限制 |
fRAc |
(專用公共數(shù)據(jù)塊) |
是 |
是 |
無限制 |
gIFg |
(專用公共數(shù)據(jù)塊) |
是 |
是 |
無限制 |
gIFt |
(專用公共數(shù)據(jù)塊) |
是 |
是 |
無限制 |
gIFx |
(專用公共數(shù)據(jù)塊) |
是 |
是 |
無限制 |
IEND |
圖像結(jié)束數(shù)據(jù) |
否 |
否 |
最后一個(gè)數(shù)據(jù)塊 |
Png圖片數(shù)據(jù)塊列表
Png格式是由四個(gè)關(guān)鍵數(shù)據(jù)塊和一些輔助數(shù)據(jù)塊組成,四個(gè)關(guān)鍵數(shù)據(jù)塊是必需的。有了它們就可以組成一張png圖片,這四個(gè)關(guān)鍵數(shù)據(jù)塊就是:
文件頭數(shù)據(jù)塊(IHDR)、調(diào)色板數(shù)據(jù)塊(PLTE)、圖象數(shù)據(jù)塊(IDAT)、圖象結(jié)束數(shù)據(jù)塊(IEND)。為了使圖象的背景色透明,獲得更好的效果,我建議還要將tRNS這個(gè)數(shù)據(jù)塊加上。原來我在手機(jī)上就用四個(gè)關(guān)鍵數(shù)據(jù)塊合成一張圖片,放到手機(jī)上背景色不透明,效果不好,加上tRNS這個(gè)數(shù)據(jù)塊就背景色透明。
每個(gè)png圖片的數(shù)據(jù)塊的結(jié)構(gòu)都是一樣的。結(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é) |
存儲用來檢測是否有錯(cuò)誤的循環(huán)冗余碼 |
CRC域中的值是對Chunk Type Code域和Chunk Data域中的數(shù)據(jù)進(jìn)行計(jì)算得到的。
每個(gè)數(shù)據(jù)塊都是由這些數(shù)據(jù)域組成的。
IHDR
文件頭數(shù)據(jù)塊IHDR(header chunk):它包含有PNG文件中存儲的圖像數(shù)據(jù)的基本信息,并要作為第一個(gè)數(shù)據(jù)塊出現(xiàn)在PNG數(shù)據(jù)流中,而且一個(gè)PNG數(shù)據(jù)流中只能有一個(gè)文件頭數(shù)據(jù)塊。
對于一個(gè)PNG文件來說,png圖片的標(biāo)志位:
十進(jìn)制數(shù) |
137 80 78 71 13 10 26 10 |
十六進(jìn)制數(shù) |
89 50 4E 47 0D |
文件頭數(shù)據(jù)塊由13字節(jié)組成,它的格式如下表所示。
域的名稱 |
字節(jié)數(shù) |
說明 |
Width |
4 bytes |
圖像寬度,以像素為單位 |
Height |
4 bytes |
圖像高度,以像素為單位 |
Bit depth |
1 byte |
圖像深度: |
ColorType |
1 byte |
顏色類型: |
Compression method |
1 byte |
壓縮方法(LZ77派生算法) |
Filter method |
1 byte |
濾波器方法 |
Interlace method |
1 byte |
隔行掃描方法: |
PLTE
調(diào)色板數(shù)據(jù)塊PLTE(palette chunk)包含有與索引彩色圖像(indexed-color image)相關(guān)的彩色變換數(shù)據(jù),它僅與索引彩色圖像有關(guān)。PLTE數(shù)據(jù)塊是定義圖像的調(diào)色板信息,PLTE可以包含1~256個(gè)調(diào)色板信息,每一個(gè)調(diào)色板信息由3個(gè)字節(jié)組成:
顏色 |
字節(jié) |
意義 |
Red |
1 byte |
0 = 黑色, 255 = 紅 |
Green |
1 byte |
0 = 黑色, 255 = 綠色 |
Blue |
1 byte |
0 = 黑色, 255 = 藍(lán)色 |
因此,調(diào)色板的長度應(yīng)該是3的倍數(shù)。
并不是所有的png格式的圖片都有調(diào)色板數(shù)據(jù)塊,真彩色圖片可能就沒有。
IDAT
圖像數(shù)據(jù)塊IDAT(image data chunk):它存儲實(shí)際的數(shù)據(jù),在數(shù)據(jù)流中可包含多個(gè)連續(xù)順序的圖像數(shù)據(jù)塊。
IDAT存放著圖像真正的數(shù)據(jù)信息,因此,如果能夠了解IDAT的結(jié)構(gòu),我們就可以很方便的生成PNG圖像。
IEND
圖像結(jié)束數(shù)據(jù)IEND(image trailer chunk):它用來標(biāo)記PNG文件或者數(shù)據(jù)流已經(jīng)結(jié)束,并且必須要放在文件的尾部。
如果我們仔細(xì)觀察PNG文件,我們會發(fā)現(xiàn),文件的結(jié)尾12個(gè)字符看起來總應(yīng)該是這樣的:
00 00 00 00 49 45 4E 44 AE 42 60 82
不難明白,由于數(shù)據(jù)塊結(jié)構(gòu)的定義,IEND數(shù)據(jù)塊的長度總是0(00 00 00 00,除非人為加入信息),數(shù)據(jù)標(biāo)識總是IEND(49 45 4E 44),因此,CRC碼也總是AE 42 60 82。
上面是png格式圖片的四個(gè)關(guān)鍵數(shù)據(jù)塊, 暫時(shí)分析到這。