生活,在繼續……
          真正的生活,應該是不斷的向前!
          posts - 11,comments - 75,trackbacks - 0

          PNG的文件結構

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

          十進制數

          137 80 78 71 13 10 26 10

          十六進制數

          89 50 4E 47 0D 0A 1A 0A


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


          PNG文件標志

          PNG數據塊

          ……

          PNG數據塊


          PNG數據塊(Chunk

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

             

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

          PNG文件格式中的數據塊

          數據塊符號

          數據塊名稱

          多數據塊

          可選否

          位置限制

          IHDR

          文件頭數據塊

          第一塊

          cHRM

          基色和白色點數據塊

          PLTEIDAT之前

          gAMA

          圖像γ數據塊

          PLTEIDAT之前

          sBIT

          樣本有效位數據塊

          PLTEIDAT之前

          PLTE

          調色板數據塊

          IDAT之前

          bKGD

          背景顏色數據塊

          PLTE之后IDAT之前

          hIST

          圖像直方圖數據塊

          PLTE之后IDAT之前

          tRNS

          圖像透明數據塊

          PLTE之后IDAT之前

          oFFs

          (專用公共數據塊)

          IDAT之前

          pHYs

          物理像素尺寸數據塊

          IDAT之前

          sCAL

          (專用公共數據塊)

          IDAT之前

          IDAT

          圖像數據塊

          與其他IDAT連續

          tIME

          圖像最后修改時間數據塊

          無限制

          tEXt

          文本信息數據塊

          無限制

          zTXt

          壓縮文本數據塊

          無限制

          fRAc

          (專用公共數據塊)

          無限制

          gIFg

          (專用公共數據塊)

          無限制

          gIFt

          (專用公共數據塊)

          無限制

          gIFx

          (專用公共數據塊)

          無限制

          IEND

          圖像結束數據

          最后一個數據塊


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

          數據塊結構
            

             PNG文件中,每個數據塊由4個部分組成,如下:

             

          名稱

          字節數

          說明

          Length (長度)

          4字節

          指定數據塊中數據域的長度,其長度不超過(2311)字節

          Chunk Type Code (數據塊類型碼)

          4字節

          數據塊類型碼由ASCII字母(A-Za-z)組成

          Chunk Data (數據塊數據)

          可變長度

          存儲按照Chunk Type Code指定的數據

          CRC (循環冗余檢測)

          4字節

          存儲用來檢測是否有錯誤的循環冗余碼

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

          x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1

             下面,我們依次來了解一下各個關鍵數據塊的結構吧。


          IHDR
             

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


          文件頭數據塊由13字節組成,它的格式如下表所示。

          域的名稱

          字節數

          說明

          Width

          4 bytes

          圖像寬度,以像素為單位

          Height

          4 bytes

          圖像高度,以像素為單位

          Bit depth

          1 byte

          圖像深度:
          索引彩色圖像:1248
          灰度圖像:124816
          真彩色圖像:816

          ColorType

          1 byte

          顏色類型:
          0
          :灰度圖像, 124816
          2
          :真彩色圖像,816
          3
          :索引彩色圖像,1248
          4
          :帶α通道數據的灰度圖像,816
          6
          :帶α通道數據的真彩色圖像,816

          Compression method

          1 byte

          壓縮方法(LZ77派生算法)

          Filter method

          1 byte

          濾波器方法

          Interlace method

          1 byte

          隔行掃描方法:
          0
          :非隔行掃描
          1
          Adam7(Adam M. Costello開發的7遍隔行掃描方法)

             

           PLTE

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


             PLTE
          數據塊是定義圖像的調色板信息,PLTE可以包含1~256個調色板信息,每一個調色板信息由3個字節組成:

          顏色

          字節

          意義

          Red

          1 byte

          0 = 黑色, 255 =

          Green

          1 byte

          0 = 黑色, 255 = 綠色

          Blue

          1 byte

          0 = 黑色, 255 = 藍色

           

             因此,調色板的長度應該是3的倍數,否則,這將是一個非法的調色板。

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

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


          IDAT
             

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

          IDAT存放著圖像真正的數據信息,因此,如果能夠了解IDAT的結構,我們就可以很方便的生成PNG圖像。


          IEND


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

          如果我們仔細觀察PNG文件,我們會發現,文件的結尾12個字符看起來總應該是這樣的:

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


             不難明白,由于數據塊結構的定義,IEND數據塊的長度總是000 00 00 00,除非人為加入信息),數據標識總是IEND49 45 4E 44),因此,CRC碼也總是AE 42 60 82

          posted on 2005-12-28 19:58 生活,在繼續……勿要停! 閱讀(1841) 評論(0)  編輯  收藏 所屬分類: 圖片格式

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 宜宾县| 临朐县| 永宁县| 老河口市| 乌拉特中旗| 英超| 金沙县| 奈曼旗| 页游| 沾化县| 巩留县| 房产| 合水县| 时尚| 新竹县| 隆德县| 都江堰市| 新竹市| 南木林县| 云梦县| 临颍县| 定兴县| 黄龙县| 济阳县| 桓台县| 平谷区| 醴陵市| 新巴尔虎右旗| 邓州市| 丁青县| 收藏| 柘城县| 兴文县| 阿合奇县| 金坛市| 资溪县| 贵南县| 沙湾县| 汽车| 板桥市| 鹿泉市|