PNG文件結(jié)構(gòu)分析_第1頁
PNG文件結(jié)構(gòu)分析_第2頁
PNG文件結(jié)構(gòu)分析_第3頁
PNG文件結(jié)構(gòu)分析_第4頁
PNG文件結(jié)構(gòu)分析_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

PNG文件結(jié)構(gòu)分析(上:了解PNG文件存放格式)序言我們都知道,在進行J2ME手機應(yīng)用程序開發(fā)時候,在圖片使用上,我們能夠使用PNG格式圖片(甚至于在有手機上,我們只能夠使用PNG格式圖片),盡管使用圖片能夠為我們應(yīng)用程序增加不少亮點,然而,只支持PNG格式圖片卻又限制了我們深入發(fā)揮可能性(其實,應(yīng)該說是因為手機平臺上處理能力有限)。在MIDP2中,或者一些廠商(如NOKIA)提供API中,提供了drawPixels/getPixels方法,這些方法深入提升了開發(fā)者處理圖片靈活性,然而,在MIDP2還未完全普及今天,我們需要在MIDP1.0中實現(xiàn)這類方法還屬于異想天開,所以,為了實現(xiàn)更高級應(yīng)用,我們必須充分挖掘PNG潛力。PNG文件結(jié)構(gòu)對于一個PNG文件來說,其文件頭總是由位固定字節(jié)來描述:十進制數(shù)13780787113102610十六進制數(shù)89504E470D0A1A0A其中第一個字節(jié)0x89超出了ASCII字符范圍,這是為了防止一些軟件將PNG文件當做文本文件來處理。文件中剩下部分由3個以上PNG數(shù)據(jù)塊(Chunk)按照特定次序組成,所以,一個標準PNG文件結(jié)構(gòu)應(yīng)該以下:PNG文件標志PNG數(shù)據(jù)塊……PNG數(shù)據(jù)塊PNG數(shù)據(jù)塊(Chunk)PNG定義了兩種類型數(shù)據(jù)塊,一個是稱為關(guān)鍵數(shù)據(jù)塊(criticalchunk),這是標準數(shù)據(jù)塊,另一個叫做輔助數(shù)據(jù)塊(ancillarychunks),這是可選數(shù)據(jù)塊。關(guān)鍵數(shù)據(jù)塊定義了4個標準數(shù)據(jù)塊,每個PNG文件都必須包含它們,PNG讀寫軟件也都必須要支持這些數(shù)據(jù)塊。即使PNG文件規(guī)范沒有要求PNG編譯碼器對可選數(shù)據(jù)塊進行編碼和譯碼,但規(guī)范提倡支持可選數(shù)據(jù)塊。下表就是PNG中數(shù)據(jù)塊類別,其中,關(guān)鍵數(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ù)塊為了簡單起見,我們假設(shè)在我們使用PNG文件中,這4個數(shù)據(jù)塊按以上先后次序進行存放,而且都只出現(xiàn)一次。數(shù)據(jù)塊結(jié)構(gòu)PNG文件中,每個數(shù)據(jù)塊由4個部分組成,以下:名稱字節(jié)數(shù)說明Length(長度)4字節(jié)指定數(shù)據(jù)塊中數(shù)據(jù)域長度,其長度不超出(231-1)字節(jié)ChunkTypeCode(數(shù)據(jù)塊類型碼)4字節(jié)數(shù)據(jù)塊類型碼由ASCII字母(A-Z和a-z)組成ChunkData(數(shù)據(jù)塊數(shù)據(jù))可變長度存放按照ChunkTypeCode指定數(shù)據(jù)CRC(循環(huán)冗余檢測)4字節(jié)存放用來檢測是否有錯誤循環(huán)冗余碼CRC(cyclicredundancycheck)域中值是對ChunkTypeCode域和ChunkData域中數(shù)據(jù)進行計算得到。CRC詳細算法定義在ISO3309和ITU-TV.42中,其值按下面CRC碼生成多項式進行計算:x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1下面,我們依次來了解一下各個關(guān)鍵數(shù)據(jù)塊結(jié)構(gòu)吧。IHDR文件頭數(shù)據(jù)塊IHDR(headerchunk):它包含有PNG文件中存放圖像數(shù)據(jù)基本信息,并要作為第一個數(shù)據(jù)塊出現(xiàn)在PNG數(shù)據(jù)流中,而且一個PNG數(shù)據(jù)流中只能有一個文件頭數(shù)據(jù)塊。文件頭數(shù)據(jù)塊由13字節(jié)組成,它格式以下表所表示。域名稱字節(jié)數(shù)說明Width4bytes圖像寬度,以像素為單位Height4bytes圖像高度,以像素為單位Bitdepth1byte圖像深度:

索引彩色圖像:1,2,4或8

灰度圖像:1,2,4,8或16

真彩色圖像:8或16ColorType1byte顏色類型:

0:灰度圖像,1,2,4,8或16

2:真彩色圖像,8或16

3:索引彩色圖像,1,2,4或8

4:帶α通道數(shù)據(jù)灰度圖像,8或16

6:帶α通道數(shù)據(jù)真彩色圖像,8或16Compressionmethod1byte壓縮方法(LZ77派生算法)Filtermethod1byte濾波器方法Interlacemethod1byte隔行掃描方法:

0:非隔行掃描

1:Adam7(由AdamM.Costello開發(fā)7遍隔行掃描方法)因為我們研究是手機上PNG,所以,首先我們看看MIDP1.0對所使用PNG圖片要求吧:在MIDP1.0中,我們只能夠使用1.0版本PNG圖片。而且,所以PNG關(guān)鍵數(shù)據(jù)塊都有尤其要求:

IHDR文件大?。篗IDP支持任意大小PNG圖片,然而,實際上,假如一個圖片過大,會因為內(nèi)存耗盡而無法讀取。顏色類型:全部顏色類型都有被支持,即使這些顏色顯示依賴于實際設(shè)備顯示能力。同時,MIDP也能支持alpha通道,不過,全部alpha通道信息都會被忽略而且看成不透明顏色對待。色深:全部色深都能被支持。壓縮方法:僅支持壓縮方式0(deflate壓縮方式),這和jar文件壓縮方式完全相同,所以,PNG圖片數(shù)據(jù)解壓和jar文件解壓能夠使用相同代碼。(其實這也就是為何J2ME能很好支持PNG圖像原因:))濾波器方法:盡管在PNG白皮書中僅定義了方法0,然而全部5種方法都被支持!隔行掃描:即使MIDP支持0、1兩種方式,然而,當使用隔行掃描時,MIDP卻不會真正使用隔行掃描方式來顯示。PLTEchunk:支持IDATchunk:圖像信息必須使用5種過濾方式中方式0(None,Sub,Up,Average,Paeth)IENDchunk:當IEND數(shù)據(jù)塊被找到時,這個PNG圖像才認為是正當PNG圖像??蛇x數(shù)據(jù)塊:MIDP能夠支持以下輔助數(shù)據(jù)塊,然而,這卻不是必須。bKGDcHRMgAMAhISTiCCPiTXtpHYs

sBITsPLTsRGBtEXttIMEtRNSzTXt關(guān)于更多信息,能夠參考PLTE調(diào)色板數(shù)據(jù)塊PLTE(palettechunk)包含有與索引彩色圖像(indexed-colorimage)相關(guān)彩色變換數(shù)據(jù),它僅與索引彩色圖像關(guān)于,而且要放在圖像數(shù)據(jù)塊(imagedatachunk)之前。PLTE數(shù)據(jù)塊是定義圖像調(diào)色板信息,PLTE能夠包含1~256個調(diào)色板信息,每一個調(diào)色板信息由3個字節(jié)組成:顏色字節(jié)意義Red1byte0=黑色,255=紅Green1byte0=黑色,255=綠色Blue1byte0=黑色,255=藍色所以,調(diào)色板長度應(yīng)該是3倍數(shù),不然,這將是一個非法調(diào)色板。對于索引圖像,調(diào)色板信息是必須,調(diào)色板顏色索引從0開始編號,然后是1、2……,調(diào)色板顏色數(shù)不能超出眾深中要求顏色數(shù)(如圖像色深為4時候,調(diào)色板中顏色數(shù)不能夠超出2^4=16),不然,這將造成PNG圖像不正當。真彩色圖像和帶α通道數(shù)據(jù)真彩色圖像也能夠有調(diào)色板數(shù)據(jù)塊,目標是便于非真彩色顯示程序用它來量化圖像數(shù)據(jù),從而顯示該圖像。IDAT圖像數(shù)據(jù)塊IDAT(imagedatachunk):它存放實際數(shù)據(jù),在數(shù)據(jù)流中可包含多個連續(xù)次序圖像數(shù)據(jù)塊。IDAT存放著圖像真正數(shù)據(jù)信息,所以,假如能夠了解IDAT結(jié)構(gòu),我們就能夠很方便生成PNG圖像。IEND圖像結(jié)束數(shù)據(jù)IEND(imagetrailerchunk):它用來標識PNG文件或者數(shù)據(jù)流已經(jīng)結(jié)束,而且必須要放在文件尾部。假如我們仔細觀察PNG文件,我們會發(fā)覺,文件結(jié)尾12個字符看起來總應(yīng)該是這么:0000000049454E44AE426082不難明白,因為數(shù)據(jù)塊結(jié)構(gòu)定義,IEND數(shù)據(jù)塊長度總是0(00000000,除非人為加入信息),數(shù)據(jù)標識總是IEND(49454E44),所以,CRC碼也總是AE426082。實例研究PNG以下是由Fireworks生成一幅圖像,圖像大小為8*8,為了方便大家觀看,我們將圖像放大:

使用UltraEdit32打開該文件,以下:

00000000~00000007:能夠看到,選中頭8個字節(jié)即為PNG文件標識。接下來地方就是IHDR數(shù)據(jù)塊了:00000008~00000020:0000000D說明IHDR頭塊長為1349484452IHDR標識00000008圖像寬,8像素00000008圖像高,8像素04色深,2^4=16,即這是一個16色圖像(也有可能顏色數(shù)不超出16,當然,假如顏色數(shù)不超出8,用03表示更適宜)03顏色類型,索引圖像00PNGSpec要求此處總為0(非0值為未來使用愈加好壓縮方法預(yù)留),表示使壓縮方法(LZ77派生算法)00同上00非隔行掃描3621A3B8CRC校驗00000021~0000002F:可選數(shù)據(jù)塊sBIT,顏色采樣率,RGB都是256(2^8=256)00000030~00000062:這里是調(diào)色板信息00000027說明調(diào)色板數(shù)據(jù)長為39字節(jié),既13個顏色數(shù)504C5445PLTE標識FFFF00顏色0FFED00顏色1…………0900B2最終一個顏色,125FF5BBDDCRC校驗00000063~000000C5:這部分包含了pHYs、tExt兩種類型數(shù)據(jù)塊共3塊,因為并不太主要,所以也不再詳細描述了。

000000C0~000000F8:以上選中部分是IDAT數(shù)據(jù)塊00000027數(shù)據(jù)長為39字節(jié)49444154IDAT標識789C……壓縮數(shù)據(jù),LZ77派生壓縮方法DA1206A5CRC校驗IDAT中壓縮數(shù)據(jù)部分在后面會有詳細介紹。000000F9~00000104:IEND數(shù)據(jù)塊,這部分正如上所說,通常都應(yīng)該是0000000049454E44AE426082至此,我們已經(jīng)能夠從一個PNG文件中識別出各個數(shù)據(jù)塊了。因為PNG中要求除關(guān)鍵數(shù)據(jù)塊外,其它輔助數(shù)據(jù)塊都為可選部分,所以,有了這個標準后,我們能夠經(jīng)過刪除全部輔助數(shù)據(jù)塊來降低PNG文件大小。(當然,需要注意是,PNG格式能夠保留圖像中層、文字等信息,一旦刪除了這些輔助數(shù)據(jù)塊后,圖像將失去原來可編輯性。)刪除了輔助數(shù)據(jù)塊后PNG文件,現(xiàn)在文件大小為147字節(jié),原文件大小為261字節(jié),文件大小降低后,并不影響圖像內(nèi)容。其實,我們能夠經(jīng)過改變調(diào)色板色值來完成一些又趣事情,比如說實現(xiàn)云彩/水波流動效果,實現(xiàn)圖像淡入淡出效果等等,在此,給出一個鏈接給大家看可能更直接:,我寫此文也就是受此文啟發(fā)。如上說過,IDAT數(shù)據(jù)塊是使用了LZ77壓縮算法生成,因為受限于手機處理器能力,所以,假如我們在生成IDAT數(shù)據(jù)塊時依然使用LZ77壓縮算法,將會使效率大打折扣,所以,為了效率,只能使用無壓縮LZ77算法,關(guān)于LZ77算法詳細實現(xiàn),此文不打算深究,如果你對LZ77算法JAVA實現(xiàn)有興趣,能夠參考以下兩個站點:參考資料:PNG文件格式白皮書:

為數(shù)不多漢字PNG格式說明:

RFC-1950(ZLIBCompressedDataFormatSpecification):/rfc/rfc1950.txt

RFC-1950(DEFLATECompressedDataFormatSpecification):/rfc/rfc1951.txt

LZ77算法JAVA實現(xiàn):

LZ77算法JAVA實現(xiàn),包含J2ME版本:PNG文件結(jié)構(gòu)分析(下:在手機上生成PNG文件)上面我們已經(jīng)對PNG存放格式有了了解,所以,生成PNG圖片只需要按照以上數(shù)據(jù)塊寫入文件即可。(因為IHDR、PLTE結(jié)構(gòu)都非常簡單,所以,這里我們只是重點講一講IDAT生成方法,IHDR和PLTE數(shù)據(jù)內(nèi)容都沿用以上數(shù)據(jù)內(nèi)容)問題確實是這么,我們知道,對于大多數(shù)圖形文件來說,我們都能夠?qū)嶋H圖像內(nèi)容映射為一個二維顏色數(shù)組,對于上面PNG文件,因為它用是16色調(diào)色板(實際是13色),所以,對于圖片映射能夠以下:

(調(diào)色板對照圖)1211109876511109876541098765439876543287654321765432106543210054321000PNGSpec中指出,假如PNG文件不是采取隔行掃描方法存放話,那么,數(shù)據(jù)是按照行(ScanLine)來存放,為了區(qū)分第一行,PNG要求在每一行前面加上0以示區(qū)分,所以,上面圖像映射應(yīng)該以下:012111098765011109876540109876543098765432087654321076543210065432100054321000另外,需要注意是,因為PNG在存放圖像時為了節(jié)約空間,所以每一行是按照位(Bit)來存放,而并不是我們想象字節(jié)(Byte),假如你沒有忘記話,我們IHDR數(shù)據(jù)塊中色深就指明了這一點,所以,為了湊成PNG所需要IDAT,我們數(shù)據(jù)得改成以下:0203169135101

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論