亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

PNG格式文件結(jié)構(gòu)詳解

系統(tǒng) 1833 0

前言

我們都知道,在進行J2ME的手機應用程序開發(fā)的時候,在圖片的使用上,我們可以使用PNG格式的圖片(甚至于在有的手機上,我們只可以使用PNG格式的圖片),盡管使用圖片可以為我們的應用程序增加不少亮點,然而,只支持PNG格式的圖片卻又限制了我們進一步發(fā)揮的可能性(其實,應該說是由于手機平臺上的處理能力有限)。 在MIDP2中,或者某些廠商(如NOKIA)提供的API中,提供了drawPixels/getPixels的方法,這些方法進一步提高了開發(fā)者處理圖片的靈活性,然而,在MIDP2還未完全普及的今天,我們需要在MIDP1 .0中實現(xiàn)這類方法還屬于異想天開,因此,為了實現(xiàn)更高級的應用,我們必須充分挖掘PNG的潛力。

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

對于一個PNG文件來說,其文件頭總是由位固定的字節(jié)來描述的:

十進制數(shù) 137 80 78 71 13 10 26 10
十六進制數(shù) 89 50 4E 47 0D 0A 1A 0A

其中第一個字節(jié)0x89超出了ASCII字符的范圍,這是為了避免某些軟件將PNG文件當做文本文件來處理。文件中剩余的部分由3個以上的PNG的數(shù)據(jù)塊(Chunk)按照特定的順序組成,因此,一個標準的PNG文件結(jié)構(gòu)應該如下:

PNG文件標志 PNG數(shù)據(jù)塊 …… PNG數(shù)據(jù)塊

PNG數(shù)據(jù)塊(Chunk)

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

下表就是PNG中數(shù)據(jù)塊的類別,其中,關鍵數(shù)據(jù)塊部分我們使用深色背景加以區(qū)分。

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ù)塊

為了簡單起見,我們假設在我們使用的PNG文件中,這4個數(shù)據(jù)塊按以上先后順序進行存儲,并且都只出現(xiàn)一次。

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

PNG文件中,每個數(shù)據(jù)塊由4個部分組成,如下:

名稱 字節(jié)數(shù) 說明
Length (長度) 4字節(jié) 指定數(shù)據(jù)塊中數(shù)據(jù)域的長度,其長度不超過(2 31 -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)冗余碼

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

x 32 +x 26 +x 23 +x 22 +x 16 +x 12 +x 11 +x 10 +x 8 +x 7 +x 5 +x 4 +x 2 +x+1

下面,我們依次來了解一下各個關鍵數(shù)據(jù)塊的結(jié)構(gòu)吧。

IHDR

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

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

域的名稱
字節(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
Comdivssion method 1 byte 壓縮方法(LZ77派生算法)
Filter method 1 byte 濾波器方法
Interlace method 1 byte 隔行掃描方法:
0:非隔行掃描
1: Adam7(由Adam M. Costello開發(fā)的7遍隔行掃描方法)

由于我們研究的是手機上的PNG,因此,首先我們看看MIDP1.0對所使用PNG圖片的要求吧:

  • 在MIDP1.0中,我們只可以使用1.0版本的PNG圖片。并且,所以的PNG關鍵數(shù)據(jù)塊都有特別要求:
    IHDR
  • 文件大小:MIDP支持任意大小的PNG圖片,然而,實際上,如果一個圖片過大,會由于內(nèi)存耗盡而無法讀取。
  • 顏色類型:所有顏色類型都有被支持,雖然這些顏色的顯示依賴于實際設備的顯示能力。同時,MIDP也能支持alpha通道,但是,所有的alpha通道信息都會被忽略并且當作不透明的顏色對待。
  • 色深:所有的色深都能被支持。
  • 壓縮方法:僅支持壓縮方式0(deflate壓縮方式),這和jar文件的壓縮方式完全相同,所以,PNG圖片數(shù)據(jù)的解壓和jar文件的解壓可以使用相同的代碼。(其實這也就是為什么J2ME能很好的支持PNG圖像的原因:))
  • 濾波器方法:盡管在PNG的白皮書中僅定義了方法0,然而所有的5種方法都被支持!
  • 隔行掃描:雖然MIDP支持0、1兩種方式,然而,當使用隔行掃描時,MIDP卻不會真正的使用隔行掃描方式來顯示。
  • PLTE chunk:支持
  • IDAT chunk:圖像信息必須使用5種過濾方式中的方式0 (None, Sub, Up, Average, Paeth)
  • IEND chunk:當IEND數(shù)據(jù)塊被找到時,這個PNG圖像才認為是合法的PNG圖像。
  • 可選數(shù)據(jù)塊:MIDP可以支持下列輔助數(shù)據(jù)塊,然而,這卻不是必須的。

    bKGD cHRM gAMA hIST iCCP iTXt pHYs
    sBIT sPLT sRGB tEXt tIME tRNS zTXt

關于更多的信息,可以參考 http://www.w3.org/TR/REC-png.html

PLTE

調(diào)色板數(shù)據(jù)塊PLTE(palette chunk)包含有與索引彩色圖像(indexed-color image)相關的彩色變換數(shù)據(jù),它僅與索引彩色圖像有關,而且要放在圖像數(shù)據(jù)塊(image data chunk)之前。

PLTE數(shù)據(jù)塊是定義圖像的調(diào)色板信息,PLTE可以包含1~256個調(diào)色板信息,每一個調(diào)色板信息由3個字節(jié)組成:

顏色

字節(jié)

意義

Red

1 byte

0 = 黑色, 255 = 紅

Green

1 byte

0 = 黑色, 255 = 綠色

Blue

1 byte

0 = 黑色, 255 = 藍色

因此,調(diào)色板的長度應該是3的倍數(shù),否則,這將是一個非法的調(diào)色板。

對于索引圖像,調(diào)色板信息是必須的,調(diào)色板的顏色索引從0開始編號,然后是1、2……,調(diào)色板的顏色數(shù)不能超過色深中規(guī)定的顏色數(shù)(如圖像色深為4的時候,調(diào)色板中的顏色數(shù)不可以超過2^4=16),否則,這將導致PNG圖像不合法。

真彩色圖像和帶α通道數(shù)據(jù)的真彩色圖像也可以有調(diào)色板數(shù)據(jù)塊,目的是便于非真彩色顯示程序用它來量化圖像數(shù)據(jù),從而顯示該圖像。

IDAT

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

IDAT存放著圖像真正的數(shù)據(jù)信息,因此,如果能夠了解IDAT的結(jié)構(gòu),我們就可以很方便的生成PNG圖像。

IEND

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

如果我們仔細觀察PNG文件,我們會發(fā)現(xiàn),文件的結(jié)尾12個字符看起來總應該是這樣的:

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ù)標識總是IEND(49 45 4E 44),因此,CRC碼也總是AE 42 60 82。

實例研究PNG

以下是由Fireworks生成的一幅圖像,圖像大小為8*8,為了方便大家觀看,我們將圖像放大:



使用UltraEdit32打開該文件,如下:
00000000~00000007:

可以看到,選中的頭8個字節(jié)即為PNG文件的標識。

接下來的地方就是IHDR數(shù)據(jù)塊了:

00000008~00000020:

  • 00 00 00 0D 說明IHDR頭塊長為13
  • 49 48 44 52 IHDR標識
  • 00 00 00 08 圖像的寬,8像素
  • 00 00 00 08 圖像的高,8像素
  • 04 色深,2^4=16,即這是一個16色的圖像(也有可能顏色數(shù)不超過16,當然,如果顏色數(shù)不超過8,用03表示更合適)
  • 03 顏色類型,索引圖像
  • 00 PNG Spec規(guī)定此處總為0(非0值為將來使用更好的壓縮方法預留),表示使壓縮方法(LZ77派生算法)
  • 00 同上
  • 00 非隔行掃描
  • 36 21 A3 B8 CRC校驗

00000021~0000002F:

可選數(shù)據(jù)塊sBIT,顏色采樣率,RGB都是256(2^8=256)

00000030~00000062:

這里是調(diào)色板信息

  • 00 00 00 27 說明調(diào)色板數(shù)據(jù)長為39字節(jié),既13個顏色數(shù)
  • 50 4C 54 45 PLTE標識
  • FF FF 00 顏色0
  • FF ED 00 顏色1
  • …… ……
  • 09 00 B2 最后一個顏色,12
  • 5F F5 BB DD CRC校驗

00000063~000000C5:

這部分包含了pHYs、tExt兩種類型的數(shù)據(jù)塊共3塊,由于并不太重要,因此也不再詳細描述了。

000000C0~000000F8:

以上選中部分是IDAT數(shù)據(jù)塊

  • 00 00 00 27 數(shù)據(jù)長為39字節(jié)
  • 49 44 41 54 IDAT標識
  • 78 9C…… 壓縮的數(shù)據(jù),LZ77派生壓縮方法
  • DA 12 06 A5 CRC校驗

IDAT中壓縮數(shù)據(jù)部分在后面會有詳細的介紹。

000000F9~00000104:

IEND數(shù)據(jù)塊,這部分正如上所說,通常都應該是

00 00 00 00 49 45 4E 44 AE 42 60 82

至此,我們已經(jīng)能夠從一個PNG文件中識別出各個數(shù)據(jù)塊了。由于PNG中規(guī)定除關鍵數(shù)據(jù)塊外,其它的輔助數(shù)據(jù)塊都為可選部分,因此,有了這個標準后,我們可以通過刪除所有的輔助數(shù)據(jù)塊來減少PNG文件的大小。(當然,需要注意的是,PNG格式可以保存圖像中的層、文字等信息,一旦刪除了這些輔助數(shù)據(jù)塊后,圖像將失去原來的可編輯性。)

刪除了輔助數(shù)據(jù)塊后的PNG文件,現(xiàn)在文件大小為147字節(jié),原文件大小為261字節(jié),文件大小減少后,并不影響圖像的內(nèi)容。

其實,我們可以通過改變調(diào)色板的色值來完成一些又趣的事情,比如說實現(xiàn)云彩/水波的流動效果,實現(xiàn)圖像的淡入淡出效果等等,在此,給出一個鏈接給大家看也許更直接: http://blog.csdn.net/flyingghost/archive/2005/01/13/251110.aspx ,我寫此文也就是受此文的啟發(fā)的。

如上說過,IDAT數(shù)據(jù)塊是使用了LZ77壓縮算法生成的,由于受限于手機處理器的能力,因此,如果我們在生成IDAT數(shù)據(jù)塊時仍然使用LZ77壓縮算法,將會使效率大打折扣,因此,為了效率,只能使用無壓縮的LZ77算法,關于LZ77算法的具體實現(xiàn),此文不打算深究,如果你對LZ77算法的JAVA實現(xiàn)有興趣,可以參考以下兩個站點:

原文地址: http://read.newbooks.com.cn/info/173555.html

PNG格式文件結(jié)構(gòu)詳解


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 美国毛片一级e片黑人片 | 深夜福利视频网址 | 久久社区 | 免费高清成人啪啪网站 | 日本高清在线一区二区三区 | 日韩成人小视频 | 热re久久精品国产99热 | 天天操天天爱天天干 | 国产精品麻豆高清在线观看 | 99热精品在线免费观看 | 91日韩精品天海翼在线观看 | 国产成a人片在线观看视频 国产成a人片在线观看视频99 | 免费女人18毛片a级毛片视频 | 精品精品国产理论在线观看 | 一级在线免费视频 | 这里只有精品视频在线 | 天天夜天干天天爽 | 真实国产乱子伦精品免费 | 素人视频在线观看 | 在线视频 二区 | 99热在线免费 | 免费看国产精品久久久久 | 国产精品国产三级国产an | 精品福利在线观看 | 国产成人经典三级在线观看 | 白蛇缘起3免费观看 | 天天做夜夜爽 | 四虎在线看 | 久草手机视频在线 | 毛片精品| 插久久| 欧美激情视频二区 | 四虎影永久在线观看精品 | 久草在线在线视频 | 毛片视频播放 | 精品91自产拍在线观看99re | 亚洲一级毛片欧美一级说乱 | 麻豆成人在线 | 欧美黄色录像 | 精品日本亚洲一区二区三区 | 2019年国产高清情侣视频 |