png檔案的資料結構映像格式

來源:互聯網
上載者:User

PNG是20世紀90年代中期開始開發的影像檔儲存格式,其目的是企圖替代GIF和TIFF檔案格式,同
時增加一些GIF檔案格式所不具備的特性。流式網狀圖形格式(Portable Network Graphic Format,PNG
)名稱來源於非官方的“PNG's Not GIF”,是一種位元影像檔案(bitmap file)儲存格式,讀成“ping”。P
NG用來儲存灰階映像時,灰階映像的深度可多到16位,儲存彩色映像時,彩色映像的深度可多到48位,
並且還可儲存多到16位的α通道資料。PNG使用從LZ77派生的無損資料壓縮演算法。

一、資料結構

1.PNG資料區塊
    PNG定義了兩種類型的資料區塊,一種是稱為關鍵資料區塊,這是標準的資料區塊,另一種叫做輔助資料
塊,這是可選的資料區塊。關鍵資料區塊定義了5個標準資料區塊,每個PNG檔案都必須包含它們,PNG讀寫軟
件也必須要支援這些資料區塊。至於可選資料區塊,規範只是提倡予以支援。
    下表就是PNG中資料區塊的類別,其中 * 號表示關鍵資料區塊:
----------------------------------------------------------------
資料區塊符號 資料區塊名稱    多資料區塊  可選否  位置限制  
----------------------------------------------------------------
      *   PNG檔案標識          否   第一塊    
IHDR *  檔案頭資料區塊    否    否   第二塊  
cHRM   基色和白色點資料區塊  否    是   在PLTE和IDAT之前 
gAMA    映像γ資料區塊     否    是   在PLTE和IDAT之前  
sBIT    樣本有效位元據塊  否    是   在PLTE和IDAT之前  
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 *   映像結束資料區塊   否    否   最後一塊  
--------------------------------------------------------------
  除了關鍵資料區塊,其它的資料區塊都是可有可無的。

2.資料區塊結構
    PNG檔案中,除了PNG檔案標識外,所有的資料區塊均由4個部分組成,如下表:
----------------------------------------------------------------------
順號 名稱      位元組數  說明  
----------------------------------------------------------------------
1 長度     4     指定第3部分資料域的長度  
2 資料區塊符號  4     由資料區塊符號的 Ascii 碼組成  
3 資料域     不定     儲存按照 Chunk Type Code 指定的資料  
4 CRC校正     4    又稱迴圈冗餘檢測,用來檢測是否有錯誤
----------------------------------------------------------------------
  迴圈冗餘檢測中的值是對第2部分資料區塊符號和第3部分資料域進行計算得到的,具體演算法定義在
ISO 3309 和 ITU-T V.42中,其值按下面的 CRC 碼產生多項式進行計算:
    x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1

3.5個關鍵資料區塊的具體結構。

 ①PNG檔案標識
  它固定為8個位元組:89 50 4E 47 0D 0A 1A 0A,前4個位元組為“.PNG”的 Ascii 碼。

 ②檔案頭資料區塊
  它包含有 PNG 檔案中儲存的映像資料的基本資料,並要作為第二個資料區塊出現在 PNG 資料流中,
一個 PNG 資料流中只能有一個檔案頭資料區塊。格式如下表所示。
-----------------------------------------------------
網域名稱稱   位元組數  說明  
-----------------------------------------------------
資料域長度  4    指定資料域的長度,固定為00 00 00 0D
資料區塊符號  4    49 48 44 52,是“IHDR”的 Ascii 碼
 (以下13個位元組是資料域)
映像寬度   4   單位:像素
映像高度   4   單位:像素
色彩深度   1     灰階映像:1、2、4、8 或 16 
            真彩色映像:8 或 16
          索引彩色映像:1、2、4 或 8 
          帶α通道資料的灰階映像:8 或 16
          帶α通道資料的真彩映像:8 或 16
顏色類型   1   灰階映像:0
            真彩色映像:2
            索引彩色映像:3
            帶α通道資料的灰階映像:4
            帶α通道資料的真彩色映像:6
壓縮方法   1    規定此位元組為0(使用LZ77派生演算法壓縮)
濾波器方法   1   通常此位元組為0
隔行掃描方法 1   非隔行掃描:0 
            Adam7(7遍隔行掃描方法):1
CRC校正     4
-----------------------------------------------------

 ③調色盤資料區塊
  包含有與索引彩色映像相關的彩色變換資料,它僅與索引彩色映像有關,而且要放在映像資料區塊之
前。它定義映像的調色盤資訊,其資料結構如下:
----------------------------------------------------------------------
網域名稱稱     位元組數  說明  
----------------------------------------------------------------------
資料域長度  4     指定資料域的長度
資料區塊符號  4     50 4C 54 45,是“PLTE”的 Ascii 碼
資料域     不定     n個調色盤,就有3×n個位元組長度,最多 3×256 位元組  
CRC校正     4
----------------------------------------------------------------------
  每一個調色盤由表示紅、綠、藍資訊的3個位元組組成,因此,調色盤的長度應該是3的倍數,否則
就是非法的調色盤。
    對於索引映像,調色盤資訊是必須的,調色盤的色彩索引從0開始編號,然後是1、2……,調色
板的顏色數不能超過檔案頭資料區塊中“色彩深度”規定的顏色數(例像色深為4時,調色盤中的顏
色數不可超過2^4=16),否則將導致 PNG 映像不合法。
    真彩色映像和帶α通道資料的真彩色映像可以有調色盤資料區塊,目的是便於非真彩色顯示程式用它
來量化映像資料,從而顯示該映像,也可以不要調色盤。

 ④映像資料區塊
  它儲存實際的資料,在資料流中可包含多個連續順序的映像資料區塊。其資料結構如下:
--------------------------------------------------------
網域名稱稱     位元組數  說明  
--------------------------------------------------------
資料域長度  4     指定資料域的長度  
資料區塊符號  4     49 44 41 54,是“IDAT”的 Ascii 碼
資料域     不定    存放著映像真正的資料資訊(壓縮的)   
CRC校正     4
--------------------------------------------------------
  由於映像資料區塊是壓縮資料,如果你能夠掌握壓縮和解壓縮的方法,那麼你就能輕易而舉地將其它
類型的圖片轉換成PNG圖片,或者將PNG圖片轉換成其它類型的圖片。

 ⑤映像結束塊
  它用來標記PNG檔案或者資料流已經結束,必須要放在檔案的尾部。其資料結構如下:
--------------------------------------------------------
網域名稱稱     位元組數  說明  
--------------------------------------------------------
資料域長度  4     全為0:00 00 00 00
資料區塊符號  4     49 45 4E 44,是“IEND”的 Ascii 碼
資料域     
CRC校正     4    AE 42 60 82
--------------------------------------------------------
    

二、一個具體的例子
    用系統畫圖建立一個8×8像素的映像,填充紅色,另存新檔PNG圖片,該圖片全部資料如下(註:因
裝置差異,你的資料也許會有微小不同):

000000: 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
000010: 00 00 00 08 00 00 00 08 08 02 00 00 00 4B 6D 29
000020: DC 00 00 00 01 73 52 47 42 00 AE CE 1C E9 00 00
000030: 00 04 67 41 4D 41 00 00 B1 8F 0B FC 61 05 00 00
000040: 00 20 63 48 52 4D 00 00 7A 26 00 00 80 84 00 00
000050: FA 00 00 00 80 E8 00 00 75 30 00 00 EA 60 00 00
000060: 3A 98 00 00 17 70 9C BA 51 3C 00 00 00 17 49 44
000070: 41 54 18 57 63 FC CF 80 03 00 25 B0 22 EC A2 20
000080: 63 06 52 07 00 11 99 38 C9 DB F8 06 FD 00 00 00
000090: 00 49 45 4E 44 AE 42 60 82

分析:

000000-000007:這8個位元組為 PNG 檔案標識。

000008-000020:檔案頭資料區塊,其中:
    00 00 00 0D:資料域長度為13位元組
    49 48 44 52:檔案頭資料區塊符號“IHDR” 
    00 00 00 08:映像寬8像素 
    00 00 00 08:映像高8像素 
    08:24位色彩深度
    02:顏色類型為真彩 
    00:使用壓縮 
    00:濾波器方法,通常為0 
    00:非隔行掃描
    4B 6D 29 DC:CRC校正碼 

000021-00002D:可選資料區塊 sRGB

00002E-00003D:可選資料區塊 gAMA(映像γ資料區塊)

00003E-000069:可選資料區塊 cHRM(基色和白色點資料區塊)

00006A-00008C:IDAT資料區塊,其中:
    00 00 00 17:資料域長度為23位元組 
    49 44 41 54:IDAT資料區塊標識“IDAT”
    18 57 63… :壓縮的資料 
    DB F8 06 FD:CRC校正碼

00008D-000098:IEND資料區塊,如上所說,固定為 00 00 00 00 49 45 4E 44 AE 42 60 82

    由於 PNG 中規定除關鍵資料區塊外,其它的輔助資料區塊都為可選的,因此,我們可以用Hex編輯器來
對這些資料做增刪實驗(Hex編輯器:http://bbs.pfan.cn/post-249666.html)
  
1.為圖片減肥:利用Hex編輯器的刪除功能,刪除000020-000069這3個輔助資料區塊,檔案位元組數由原
來的153位元組縮減到80位元組,而並不影響映像的內容!試試看,你成功了嗎?
  但要注意的是,PNG 格式可以儲存映像中的層、文字等資訊,一旦刪除了這些資料後,映像將失去
原來的可編輯性。

2.添加文本資訊:增加這麼一個字串“PNG圖片”,字串的Ascii碼是50 4E 47 CD BC C6 AC,共7
個位元組,所以資料域長度應為00 00 00 07,資料區塊符號是“tEXt”,Ascii是74 45 58 74,至於CRC校
驗碼,我們隨便寫4個位元組,就寫 BA 2D 29 CC 吧!這些資訊全合起來就是:
  00 00 00 07 74 45 58 74 50 4E 47 CD BC C6 AC BA 2D 29 CC
共19位元組。由於tEXt資料區塊可以出現在任意資料區塊之間,我們就利用Hex編輯器的插入功能把這19個字
節從000068插入吧,然後另存新檔,再用附件中的代碼開啟它,我們就不禁可以看到映像,還可以看到這
7個字元文本了!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.