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

姓名:鄺念君

學(xué)號:14020150024

轉(zhuǎn)載自:http://blog.chinaunix.net/uid-20622737-id-3130430.html ,有刪節(jié)捻脖。

【嵌牛導(dǎo)讀】:在Linux編程中浸剩,免不了要對圖片文件進(jìn)行讀寫操作,那就得了

解PNG文件的儲存方式。

【嵌牛鼻子】: 文件結(jié)構(gòu) 除嘹、數(shù)據(jù)塊

【嵌牛提問】: 如何讀入PNG圖片文件?

【嵌牛正文】:

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

根據(jù)PNG文件的定義來說岸蜗,其文件頭位置總是由位固定的字節(jié)來描述的:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 十進(jìn)制數(shù) 137 80 78 71 13 10 26 10

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?十六進(jìn)制數(shù) 89 50 4E 47 0D 0A 1A 0A

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

PNG數(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ī)范沒有要求PNG編譯碼器對可選數(shù)據(jù)塊進(jìn)行編碼和譯碼坛怪,但規(guī)范提倡支持可選數(shù)據(jù)塊。

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



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

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

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


CRC(cyclic redundancy check)域中的值是對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

CRC: 一種校驗(yàn)算法拌倍。僅僅用來校驗(yàn)數(shù)據(jù)的正確性的

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

IHDR

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

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



由于本文很多設(shè)計(jì)到了PNG在手機(jī)方面的應(yīng)用车摄,因此在此提出MIDP1.0對所使用PNG圖片的要求:

在MIDP1.0中寺谤,只可以使用1.0版本的PNG圖片。

文件大兴辈ァ:MIDP支持任意大小的PNG圖片变屁,然而實(shí)際上,如果一個(gè)圖片過大意狠,會由于內(nèi)存耗盡而無法讀取粟关。

顏色類型:所有顏色類型都有被支持,雖然這些顏色的顯示依賴于實(shí)際設(shè)備的顯示能力摄职。同時(shí)誊役,MIDP也能支持alpha通道获列,但是谷市,所有的alpha通道信息都會被忽略并且當(dāng)作不透明的顏色對待。

色深:所有的色深都能被支持击孩。

壓縮方法:僅支持deflate壓縮方式迫悠,這和jar文件的壓縮方式完全相同,所以巩梢,PNG圖片數(shù)據(jù)的解壓和jar文件的解壓可以使用相同的代碼创泄。

濾波器方法:在PNG中所有的5種方法都被支持。

隔行掃描:雖然MIDP支持0括蝠、1兩種方式鞠抑,然而,當(dāng)使用隔行掃描時(shí)忌警,MIDP卻不會真正的使用隔行掃描方式來顯示搁拙。

PLTE chunk:支持

IDAT chunk:圖像信息必須使用5種過濾方式中的方式之一 (None, Sub, Up, Average, Paeth)

IEND chunk:當(dāng)IEND數(shù)據(jù)塊被找到時(shí),這個(gè)PNG圖像才認(rèn)為是合法的PNG圖像。

可選數(shù)據(jù)塊:MIDP可以支持下列輔助數(shù)據(jù)塊箕速,然而酪碘,這卻不是必須的。

bKGD cHRM gAMA hIST iCCP iTXt pHYs

sBIT sPLT sRGB tEXt tIME tRNS zTXt

PLTE

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

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



因此,調(diào)色板的長度應(yīng)該是3的倍數(shù)募谎,否則扶关,這將是一個(gè)非法的調(diào)色板。

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

真彩色圖像和帶alpha通道數(shù)據(jù)的真彩色圖像也可以有調(diào)色板數(shù)據(jù)塊东抹,目的是便于非真彩色顯示程序用它來量化圖像數(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岗喉。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秋度,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子钱床,更是在濱河造成了極大的恐慌荚斯,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件查牌,死亡現(xiàn)場離奇詭異事期,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)纸颜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門兽泣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胁孙,你說我怎么就攤上這事唠倦。” “怎么了涮较?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵稠鼻,是天一觀的道長。 經(jīng)常有香客問我狂票,道長候齿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任闺属,我火速辦了婚禮慌盯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘掂器。我一直安慰自己亚皂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布唉匾。 她就那樣靜靜地躺著孕讳,像睡著了一般匠楚。 火紅的嫁衣襯著肌膚如雪巍膘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天芋簿,我揣著相機(jī)與錄音峡懈,去河邊找鬼。 笑死与斤,一個(gè)胖子當(dāng)著我的面吹牛肪康,可吹牛的內(nèi)容都是我干的荚恶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼磷支,長吁一口氣:“原來是場噩夢啊……” “哼谒撼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起雾狈,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤廓潜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后善榛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辩蛋,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年移盆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了悼院。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡咒循,死狀恐怖据途,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情叙甸,我是刑警寧澤昨凡,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站蚁署,受9級特大地震影響便脊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜光戈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一哪痰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧久妆,春花似錦晌杰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至烂琴,卻和暖如春爹殊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奸绷。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工梗夸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人号醉。 一個(gè)月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓反症,卻偏偏與公主長得像辛块,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子铅碍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容