png檔案格式詳解【轉】
5.2.2 PNG影象檔案儲存結構(1)
PNG檔案儲存結構的格式可以在http://www.w3.org/TR/REC-png.htm上找到定義。
BMP檔案總體上由兩部分組成,分別是PNG檔案標誌和資料塊(chunks),如表5-8所示。其中資料塊分為兩類:關鍵資料塊(critical chunk)和輔助資料塊(ancillary chunks)。
表5-8 PNG檔案的組成結構
PNG檔案標誌 |
資料塊(chunks) |
1.PNG檔案標誌
PNG檔案標誌由8位元組資料組成:89 50 4E 47 0D 0A 1A 0Ah,其中50 4E 47對應的ASCII值是"PNG"。
2.資料塊(chunks)
緊跟在PNG檔案標誌後面的資料是資料塊(chunks),資料塊(chunks)分為兩類:關鍵資料塊(critical chunks)和輔助資料塊(ancillary chunks)。
關鍵資料塊(critical chunk)在PNG檔案中是必須有的,而輔助資料塊(ancillary chunks)是可選的。
關鍵資料塊(critical chunks)由4部分組成:檔案頭資料塊(IHDR)、調色盤資料塊(PLTE)、影象資料塊(IDAT)和影象結束資料(IEND),其中調色盤資料塊(PLTE)根據影象的色深可選。
輔助資料塊(ancillary chunks)一共有14個,這些輔助資料塊包含了很多資訊,輔助資料塊不是必須包含的。
PNG檔案的關鍵資料塊和輔助資料塊的組織順序如表5-9和表5-10所示。
表5-9 PNG檔案的關鍵資料塊(critical chunks)組織順序
資料塊名稱 |
允許多 個數據塊 |
位 置 |
檔案頭資料塊(IHDR) |
不允許 |
第一個資料塊 |
調色盤資料塊(PLTE) |
不允許 |
第二個資料塊,可選 |
影象資料塊(IDAT) |
允許 |
如果有調色盤資料塊(PLTE),則是第三個資料塊,如果沒有調色盤資料塊(PLTE),則時第二個資料塊。如果有多個影象資料塊,則必須按影象資料連續儲存 |
影象結束資料(IEND) |
不允許 |
最後一個數據塊 |
表5-10 PNG檔案的輔助資料塊(ancillary chunks)組織順序
資料塊名稱 |
允許多個 資料塊 |
位 置 |
基色和白色點資料塊(cHRM) |
不允許 |
在PLTE和IDAT之前 |
影象γ資料塊(gAMA) |
不允許 |
在PLTE和IDAT之前 |
ICCP(iCCP) |
允許 |
在PLTE之後IDAT之前如果有iCCP,則無sRGB |
續表
資料塊名稱 |
允許多個 資料塊 |
位 置 |
樣本有效位資料塊(sBIT) |
不允許 |
在PLTE和IDAT之前 |
標準RPG顏色(sRGB) |
不允許 |
在PLTE之後IDAT之前如 果有sRGB,則無iCCP |
背景顏色資料塊(bKGD) |
不允許 |
在PLTE之後IDAT之前 |
影象直方圖資料塊(hIST) |
不允許 |
在PLTE之後IDAT之前 |
影象透明資料塊(tRNS) |
不允許 |
在PLTE之後IDAT之前 |
物理畫素尺寸資料塊(pHYs) |
不允許 |
在IDAT之前 |
建議調色盤(sPLT) |
允許 |
在IDAT之前 |
影象最後修改時間資料塊(tIME) |
不允許 |
無限制 |
國際文字資料(iTXt) |
允許 |
無限制 |
文字資訊資料塊(tEXt) |
允許 |
無限制 |
壓縮文字資料塊(zTXt) |
允許 |
無限制 |
5.2.2 PNG影象檔案儲存結構(2)
用影象可以清晰顯示錶5-9和表5-10之間的關係,如圖5-13和圖5-14所示。
(點選檢視大圖)圖5-13 包含調色盤資料塊(PLTE)的PNG影象檔案格式 |
(點選檢視大圖)圖5-14 不包含調色盤資料塊(PLTE)的PNG影象檔案格式 |
圖中上標的含義如表5-11所示。
表5-11 上標的含義
符 號 |
含 義 |
1 |
只有1個 |
+ |
1個或多個 |
? |
0個或1個 |
* |
0個或多個 |
| |
2選1 |
PNG影象檔案中每一塊資料塊的格式都是相同的,分別由4個部分組成,格式如表5-12所示。
表5-12 PNG檔案的資料塊格式
字 段 名 |
大小(單 位:位元組) |
描 述 |
Length(長度) |
4 |
指定資料塊中的資料長度 |
Chunk Type Code(資料塊型別碼) |
4 |
資料塊型別,例如 IHDR、PLTE、IDAT等 |
Chunk Data(資料塊資料) |
Length |
儲存資料 |
CRC(迴圈冗餘檢測) |
4 |
迴圈冗餘碼 |
CRC迴圈冗餘碼生成的計算方式是通過對Chunk Type Code和Chunk Data中的資料進行計算得到的,計算方式如下:
x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1 |
5.2.2 PNG影象檔案儲存結構(3)
下面將講解在PNG檔案中的4個關鍵資料塊(critical chunk)的含義。
① 檔案頭資料塊(IHDR)
檔案頭資料塊(IHDR)它包含有PNG檔案中儲存的影象資料的基本資訊,如影象的寬高、色深、顏色型別、壓縮方式等。一個PNG檔案只能有一個檔案頭資料塊,表5-13列出了檔案頭資料塊(IHDR)中各欄位的含義。
表5-13 檔案頭資料塊(IHDR) 中各欄位的含義
欄位名 |
大小(單 位:位元組) |
描 述 |
Width |
4 |
影象寬度,以畫素為單位 |
Height |
4 |
影象高度,以畫素為單位 |
Bit depth |
1 |
影象深度: 索引彩色影象:1,2,4或8 灰度影象:1,2,4,8或16 真彩色影象:8或16 |
ColorType |
1 |
顏色型別: 0:灰度影象,1,2,4,8或16 2:真彩色影象,8或16 3:索引彩色影象,1,2,4或8 4:帶α通道資料的灰度影象,8或16 6:帶α通道資料的真彩色影象,8或16 |
Compression method |
1 |
壓縮方法(LZ77變種演算法) |
Filter method |
1 |
濾波器方法 |
Interlace method |
1 |
隔行掃描方法: 0:非隔行掃描 1: Adam7(由Adam M. Costello開發的7遍隔行掃描方法) |
檔案頭資料塊(IHDR)結構可以使用如下程式碼定義:
typedef struct { DWORD btChunkLen; CHAR btChunkType[4]; } PNG_CHUNK_HEADER; typedef enum pngColorSpaceType { GrayScale = 0, TrueColor = 2, Indexed = 3, AlphaGrayScale = 4, AlphaTrueColor = 6 } PNG_COLOR_SPACE_TYPE; // Compression Methods typedef enum pngCompressionMethod { Deflate = 0 } PNG_COMPR_METHOD; // Filter Methods typedef enum pngFilterMethod { AdaptiveFiltering = 0 } PNG_FILTER_METHOD; // Interlace Methods typedef enum pngInterlaceMethod { NoInterlace = 0, Adam7Interlace = 1 } PNG_INTERLACE_METHOD; // IHDR data typedef struct { UINT width; UINT height; BYTE bit_depth; PNG_COLOR_SPACE_TYPE color_type; PNG_COMPR_METHOD compr_method; PNG_FILTER_METHOD filter_method; PNG_INTERLACE_METHOD interlace_method; } IHDR_CHUNK_DATA; |
② 調色盤資料塊(PLTE)
PNG的調色盤資料塊(PLTE)和之前介紹BMP影象格式中的調色盤類似,都是提供給8位色深以下的影象使用。PNG的調色盤由3個位元組組成,每個位元組分別表示紅、綠、藍三色的顏色值。
對於PNG影象檔案來說,大於8位色深的影象,如真彩色影象也可以使用調色盤,目的是便於非真彩色顯示程式用它來量化影象資料,從而顯示該影象。
一個PNG檔案只能有一個調色盤資料塊,調色盤資料塊從下標0開始,表5-14列出了調色盤資料塊(PLTE)中各欄位的含義。
表5-14 調色盤資料塊(PLTE) 中各欄位的含義
欄位名 |
大小(單 位:位元組) |
描 述 |
btRed |
1 |
紅色顏色值 |
btGreen |
1 |
綠色顏色值 |
btBlue |
1 |
藍色顏色值 |
調色盤資料塊(PLTE)結構可以使用如下程式碼定義:
typedef struct { BYTE btRed ; BYTE btGreen; BYTE btBlue; } PNG_PALETTE_PIXEL; |
5.2.2 PNG影象檔案儲存結構(4)
③ 影象資料塊(IDAT)
PNG的影象資料塊(IDAT)儲存影象的實際資料,相當於BMP影象的影象資料,由於PNG可包含多幅影象,所以PNG的影象資料塊可能是由一幅影象的資料組成,也可能是由多幅影象的資料組成。
影象資料塊中的影象資料可能是經過變種的LZ77壓縮編碼DEFLATE壓縮的,關於DEFLATE詳細介紹可以參考《DEFLATE Compressed Data Format Specification version 1.3》,網址:http://www.ietf.org/rfc/rfc1951.txt 。
影象資料塊(IDAT)結構可以使用如下程式碼定義:
PNG_CHUNK_HEADER chunkHdr; BYTE idatChunkData[chunkHdr.btChunkLen]; DWORD idatCrc <format=hex>; |
④ 影象結束資料(IEND)
PNG的影象結束資料(IEND)用來標記PNG檔案結束,並且必須要放在檔案的尾部。一般情況下,所有PNG影象結束資料(IEND)的十六進位制數值都是一樣的,具體的數值如下:
00 00 00 00 49 45 4E 44 AE 42 60 82 |
PNG的輔助資料塊(ancillary chunks)一共有14個,可以分為5類,如表5-10所示,由於篇幅關係不能將全部輔助資料塊(ancillary chunks)的詳細結構進行說明,如果讀者有興趣請參考http://www.w3.org/TR/REC-png.html。
5.2.3 分析PNG影象檔案結構(1)
結合上面對PNG檔案的分析,下面分別對256色和16位色的PNG影象進行十六進位制分析,通過分析PNG檔案讓讀者更深入瞭解PNG檔案格式。
如圖5-15和圖5-16所示,分別為256色PNG影象pic1.png和16位色PNG影象pic2.png。其中pic1.png影象的解析度為200×150,檔案大小為19 534 位元組。pic2.png影象的解析度為200×150,檔案大小為104 744位元組,帶透明通道。
圖5-15 pic1.png影象 |
圖5-16 pic2.png影象 |
現在來分析pic1.png的影象檔案,在Winhex中開啟pic1.png,如圖5-17所示。
(點選檢視大圖)圖5-17 在Winhex中開啟pic1.png檔案 |
首先分析PNG的檔案標誌。根據PNG檔案的定義,從檔案頭開始前8位元組資料是PNG檔案的標誌,如圖5-18所示。
(點選檢視大圖)圖5-18 PNG檔案的檔案標誌 |
接下來應該就是PNG檔案的資料塊結構了,按照前面對PNG檔案結構的分析,第一個資料塊應該是檔案頭資料塊(IHDR)資料塊,檔案頭資料塊(IHDR)定義了PNG檔案的寬高、色深、壓縮方法等引數,如圖5-19所示。
(點選檢視大圖)圖5-19 檔案頭資料塊(IHDR)結構 |
5.2.3 分析PNG影象檔案結構(2)
表5-15歸納了pic1.png影象檔案中檔案頭資料塊(IHDR)中各欄位的含義。由於PNG檔案使用Big-Endian順序儲存資料,所以不需要反轉位元組資料理解。
表5-15 pic1.png影象檔案中檔案頭資料塊(IHDR)的各欄位含義
十六進位制值 |
描 述 |
00 00 00 0D |
檔案頭的資料長度,00 00 00 0D =13 |
49 48 44 52 |
資料塊型別標誌,49 48 44 52的ASCII值等於IHDR |
00 00 00 C8 |
影象的寬度,00 00 00 C8 = 200 |
00 00 00 96 |
影象的高度,00 00 00 96 = 150 |
08 |
色深,表示2的8次冪等於256色 |
03 |
03表示索引影象 |
00 |
00表示使用Deflate壓縮編碼壓縮影象資料 |
00 |
00表示為將來使用更好的壓縮方法預留 |
00 |
00表示非隔行掃描 |
AC 02 37 2B |
AC 02 37 2B表示CRC |
從表5-14看到pic1.png檔案的檔案頭資料塊(IHDR)結構中的CRC欄位的值為AC 02 37 2B,這個CRC值是按照從資料塊型別標誌欄位到CRC欄位前一位元組的資料計算而來的,即使用資料49 48 44 52 00 00 00 C8 00 00 00 96 08 03 00 00 00計算,CRC的計算程式碼如下:
/*8位訊息的CRC表格*/ unsigned long crc_table[256]; /*Flag:CRC表格計算完了嗎?初始化 False*/ int crc_table_computed = 0; /*寫一個CRC表格*/ void make_crc_table(void) { unsigned long c; int n, k; for (n = 0; n < 256; n++) { c = (unsigned long) n; for (k = 0; k < 8; k++) { if (c & 1) c = 0xedb88320L ^ (c >> 1); else c = c >> 1; } crc_table[n] = c; } crc_table_computed = 1; } /*使用bu[0..len-1]更新CRC表格*/ unsigned long update_crc(unsigned long crc, unsigned char *buf, int len) { unsigned long c = crc; int n; if (!crc_table_computed) make_crc_table(); for (n = 0; n < len; n++) { c = crc_table[(c ^ buf[n]) & 0xff] ^ (c >> 8); } return c; } /* 返回 CRC表格buf[0..len-1]. */ unsigned long crc(unsigned char *buf, int len) { return update_crc(0xffffffffL, buf, len) ^ 0xffffffffL; } main() { /*計算CRC需要的初始化資料,不同的資料塊有不同的初始化資料*/ unsigned char buf[17] = { 0x49,0x48,0x44,0x52,0x00,0x00,0x00,0xC8,0x00, 0x00,0x00,0x96,0x08,0x03,0x00,0x00, 0x00 }; unsigned long value=0; value= crc(buf,17); } |
繼續分析下面的資料塊,PNG影象檔案的資料塊型別由資料塊型別標誌決定,按照PNG影象檔案中資料塊的資料結構分析,接下來的資料塊是物理畫素尺寸資料塊(pHYs),物理畫素尺寸資料塊(pHYs)指定畫素大小或影象的寬和高的比例。
表5-16所示為物理畫素尺寸資料塊(pHYs)中各欄位的含義。
表5-16 物理畫素尺寸資料塊(pHYs) 中各欄位的含義
字 段 名 |
大小(單 位:位元組) |
描 述 |
physPixelPerUnitX |
4 |
每單位多少畫素,x軸 |
physPixelPerUnitY |
4 |
每單位多少畫素,y軸 |
UnkownUnit ,Meter |
1 |
列舉型別,UnkownUnit=0,表示只定義了畫素顯示的比例,未定義實際畫素大小。 列舉型別,Meter=1,表示定義單位為米 |
物理畫素尺寸資料塊(pHYs)的結構可以用以下程式碼定義:
PNG_CHUNK_HEADER chunkHdr ; uint physPixelPerUnitX; uint physPixelPerUnitY; enum { UnkownUnit = 0, Meter = 1 } pHYs; DWORD pHYsCrc; |
圖5-20所示為pic1.png中的物理畫素尺寸資料塊(pHYs)的結構。
(點選檢視大圖)圖5-20 pic1.png中的物理畫素尺寸資料塊(pHYs)的結構 |
5.2.3 分析PNG影象檔案結構(3)
表5-17所示為pic1.png影象檔案中物理畫素尺寸資料塊(pHYs)中各欄位的含義。
表5-17 pic1.png影象檔案中物理畫素尺寸資料塊(pHYs)中各欄位的含義
十六進位制值 |
描 述 |
00 00 00 09 |
物理畫素尺寸資料塊的長度,00 00 00 09 =9 |
70 48 59 73 |
資料塊型別標誌,70 48 59 73的ASCII值等於pHYs |
00 00 0B 13 |
x軸上每米畫素的數量,00 00 0B 13 = 2835,即每米2835個畫素 |
00 00 0B 13 |
y軸上每米畫素的數量,00 00 0B 13 = 2835,即每米2835個畫素 |
01 |
Meter=1,將單位定義為米 |
00 9A 9C 18 |
CRC值 |
繼續分析下面的資料,按照前面的分析方法,分析出接下來的資料塊是iCCP,iCCP資料塊是PNG解碼時進行特殊的顏色處理資訊。
iCCP資料塊的結構可以用以下程式碼定義:
PNG_CHUNK_HEADER chunkHdr typedef struct { string profile_name; unsigned byte red; } PNG_ICCP_CHUNK_DATA; DWORD ICCPCrc; |
圖5-21所示為pic1.png中的iCCP的資料結構。
(點選檢視大圖)圖5-21 pic1.png影象檔案中iCCP資料塊結構 |
(點選檢視大圖)圖5-21 pic1.png影象檔案中iCCP資料塊結構 |
表5-18所示為pic1.png影象檔案中的iCCP資料塊各欄位的含義。
表5-18 pic1.png影象檔案中的iCCP資料塊各欄位的含義
十六進位制值 |
描 述 |
00 00 0A 4D |
ICCP資料塊的長度,00 00 0A 4D = 2637 |
69 43 43 50 |
資料塊型別標誌,69 43 43 50的ASCII值等於iCCP |
50 68 6F 74 6F 73 68 6F 70 20 49 43 43 20 70 72 6F 66 69 6C 65 00 |
配置檔名,長度1~79位元組,以0作為終止符的字串。 50 68 6F 74 6F 73 68 6F 70 20 49 43 43 20 70 72 6F 66 69 6C 65 00 的ASCII值等於Photoshop ICC profile |
00 |
壓縮方法,0表示使用deflate壓縮 |
78 DA 9D 53~F7 84 F3 FB |
壓縮後的配置檔案,解碼時使用 |
繼續分析下面的資料,按照前面的分析方法,分析出接下來的資料塊是gAMA,gAMA資料塊是PNG解碼時進行gamma校正的資訊。
gAMA資料塊的結構可以用以下程式碼定義:
PNG_CHUNK_HEADER chunkHdr; BYTE gamaChunkData[chunkHdr.btChunkLen]; DWORD gamaCrc; |
圖5-22所示為pic1.png中的gAMA的資料結構:
(點選檢視大圖)圖5-22 pic1.png影象檔案中gAMA資料塊結構 |
5.2.3 分析PNG影象檔案結構(4)
表5-19所示為pic1.png影象檔案中的gAMA資料塊各欄位的含義。
表5-19 pic1.png影象檔案中的gAMA資料塊各欄位的含義
十六進位制值 |
描 述 |
00 00 00 04 |
gAMA資料塊的長度,00 00 00 04 = 4 |
67 41 4D 41 |
資料塊型別標誌,67 41 4D 41的ASCII值等於gAMA |
00 00 B1 8E |
gamma校正資訊 |
7C F8 51 93 |
CRC值 |
繼續分析下面的資料,按照前面的分析方法,分析出接下來的資料塊是cHRM,cHRM是在裝置不能夠顯示正確的顏色時,使影象儘可能校正顏色的資訊,也叫做裝置無關的顏色資訊。
cHRM資料塊的結構可以用以下程式碼定義:
typedef struct { uint x; uint y; } PNG_POINT; typedef struct { PNG_POINT white; PNG_POINT red; PNG_POINT green; PNG_POINT blue; } PNG_CHRM_CHUNK_DATA; PNG_CHUNK_HEADER chunkHdr; PNG_CHRM_CHUNK_DATA chrmChunkData; DWORD chrmCrc; |
圖5-23所示為pic1.png中的cHRM的資料結構。
(點選檢視大圖)圖5-23 pic1.png影象檔案中cHRM資料塊結構 |
表5-20所示為pic1.png影象檔案中的cHRM資料塊各欄位的含義。
表5-20 pic1.png影象檔案中的cHRM資料塊各欄位的含義
十六進位制值 |
描 述 |
00 00 00 20 |
cHRM資料塊的長度,00 00 00 20 = 32 |
63 48 52 4D |
資料塊型別標誌,63 48 52 4D的ASCII值等於cHRM |
00 00 7A 25 |
白色點的x軸座標,00 00 7A 25 = 31269 |
續表
十六進位制值 |
描 述 |
00 00 80 83 |
白色點的y軸座標,00 00 80 83 = 32899 |
00 00 F9 FF |
紅x座標,00 00 F9 FF = 63999 |
00 00 80 E9 |
紅y座標,00 00 80 E9 = 33001 |
00 00 75 30 |
綠x座標,00 00 75 30 = 30000 |
00 00 EA 60 |
綠y座標,00 00 EA 60 = 60000 |
00 00 3A 98 |
藍x座標,00 00 3A 98 = 15000 |
00 00 17 6F |
藍x座標,00 00 17 6F = 5999 |
92 5F C5 46 |
CRC值 |
繼續分析下面的資料,按照前面的分析方法,分析出接下來的資料塊是調色盤資料塊(PLTE),因為pic1.png是256色影象,所以應該有256個調色盤項,每個調色盤項佔3位元組。
調色盤資料塊(PLTE)的結構可以用以下程式碼定義:
typedef struct { BYTE btRed; BYTE btGreen; BYTE btBlue; } PNG_PALETTE_PIXEL; PNG_CHUNK_HEADER chunkHdr; PNG_PALETTE_PIXEL plteChunkData[chunkHdr.btChunkLen/3]; DWORD plteCrc; |
5.2.3 分析PNG影象檔案結構(5)
圖5-24所示為pic1.png中的調色盤資料塊(PLTE)的資料結構。
(點選檢視大圖)圖5-24 pic1.png影象檔案中調色盤資料塊(PLTE)結構 |
(點選檢視大圖)圖5-24 pic1.png影象檔案中調色盤資料塊(PLTE)結構 |
表5-21 所示為pic1.png影象檔案中的調色盤資料塊(PLTE)各欄位的含義。
表5-21 pic1.png影象檔案中調色盤資料塊(PLTE)各欄位的含義
十六進位制值 |
描 述 |
00 00 03 00 |
PLTE資料塊的長度,00 00 03 00 = 768 |
50 4C 54 45 |
資料塊型別標誌,50 4C 54 45的ASCII值等於PLTE |
00 00 00 |
調色盤第1個索引 |
FF FF FF |
調色盤第2個索引 |
EA FF FF |
調色盤第3個索引 |
………… |
調色盤第…個索引 |
E4 DC DC |
調色盤第255個索引 |
FF FF FF |
調色盤第256個索引 |
7D 2C 3D AD |
CRC值 |
繼續分析下面的資料,按照前面的分析方法,分析出接下來的資料塊是影象透明資料塊(tRNS),對於256色影象來說,影象透明資料塊(tRNS)一共有256項,每項對應調色盤資料塊中的一項,00代表透明,FF代表不透明。
影象透明資料塊(tRNS)的結構可以用以下程式碼定義:
PNG_CHUNK_HEADER chunkHdr; BYTE trnsChunkData[chunkHdr.btChunkLen] DWORD trnsCrc; |
圖5-25所示為pic1.png中的影象透明資料塊(tRNS)的資料結構。
(點選檢視大圖)圖5-25 pic1.png影象檔案中影象透明資料塊(tRNS)的結構 |
表5-22所示為pic1.png影象檔案中的影象透明資料塊(tRNS)各欄位的含義。
表5-22 pic1.png影象檔案中影象透明資料塊(tRNS)各欄位的含義
十六進位制值 |
描 述 |
00 00 01 00 |
tRNS資料塊的長度,00 00 01 00 = 256 |
74 52 4E 53 |
資料塊型別標誌,74 52 4E 53的ASCII值等於tRNS |
FF~00 |
影象透明資料塊,一共256個,每個對應調色 |
53 F7 07 25 |
CRC值 |
繼續分析下面的資料,按照前面的分析方法,分析出接下來的資料塊是影象資料塊(IDAT)。對於256色影象來說,影象資料塊(IDAT)存放的是指向調色盤的索引序號,對於16位色以上影象,影象資料塊(IDAT)存放的是實際畫素顏色,按0xRRGGBB排列。需要注意的是,影象資料塊(IDAT)中的資料是經過變種的LZ77壓縮過的。
影象資料塊(IDAT)的結構可以用以下程式碼定義:
PNG_CHUNK_HEADER chunkHdr; BYTE idatChunkData[chunkHdr.btChunkLen]; DWORD idatCrc; |
5.2.3 分析PNG影象檔案結構(6)
圖5-26所示為pic1.png中的影象資料塊(IDAT)的資料結構。
(點選檢視大圖)圖5-26 pic1.png中的影象資料塊(IDAT)的資料結構 |
(點選檢視大圖)圖5-26 pic1.png中的影象資料塊(IDAT)的資料結構 |
表5-23所示為pic1.png影象檔案中的影象資料塊(IDAT)各欄位的含義。
表5-23 pic1.png影象檔案中影象資料塊(IDAT)各欄位的含義
十六進位制值 |
描 述 |
00 00 3D 53 |
IDAT資料塊的長度,00 00 3D 53 = 15699 |
49 44 41 54 |
資料塊型別標誌,49 44 41 54的ASCII值等於IDAT |
78~67 |
影象資料塊,一共15699位元組,使用變種的LZ77壓縮過 |
0E EE 51 34 |
CRC值 |
繼續分析下面的資料,按照前面的分析方法,分析出接下來的資料塊是影象結束資料(IEND),一般情況下所有PNG影象的影象結束資料(IEND)是一樣的,除非自行修改。
影象結束資料(IEND)的結構可以用以下程式碼定義:
PNG_CHUNK_HEADER chunkHdr; DWORD idatCrc; |
圖5-27所示為pic1.png中的影象結束資料(IEND)的資料結構。
(點選檢視大圖)圖5-27 pic1.png中的影象結束資料(IEND)的資料結構 |
表5-24所示為pic1.png影象檔案中的影象結束資料(IEND)各欄位的含義。
表5-24 pic1.png影象檔案中影象結束資料(IEND)各欄位的含義
十六進位制值 |
描 述 |
00 00 00 00 |
IEND資料塊的長度,00 00 00 00 = 0 |
49 45 4E 44 |
資料塊型別標誌,49 45 4E 44的ASCII值等於IEND |
AE 42 60 82 |
CRC值 |
pic1.png檔案格式已經分析完畢,pic2.png的檔案格式可以參考上面pic1.png的分析,表5-25顯示了pic1.png和pic2.png的檔案結構區別。
表5-25 pic1.png和pic2.png的檔案結構區別
pic1.png檔案結構 |
pic2.png檔案結構 |
IHDR |
IHDR |
pHYs |
pHYs |
iCCP |
iCCP |
gAMA |
gAMA |
cHRM |
cHRM |
PLTE |
× |
tRNS |
× |
IDAT |
IDAT |
IEND |
IEND |
從表5-24可以看出pic2.png沒有PLTE和tRNS資料塊,因為pic2.png是16位色影象不需要使用調色盤。
PNG影象檔案儲存的資料塊比較多,一般情況每個PNG影象檔案的iCCP、gAMA和cHRM資料塊中的資料是一樣的,只有IHDR和pHYs兩個資料塊中某些欄位資料不同,如圖5-28所示。
(點選檢視大圖)圖5-28 兩張不同的PNG格式影象的區別 |
(點選檢視大圖)圖5-28 兩張不同的PNG格式影象的區別 |
所以很多時候遊戲程式設計人員為了節省遊戲資源佔用的硬碟空間,去掉了PNG影象檔案的某些資料塊。如果遊戲的資源打包檔案包含了PNG影象檔案,但去掉了PNG某些資料塊,這樣對分析遊戲資源包檔案格式帶來了一定的困難,但幸好PNG影象檔案的某些資料塊還是要保留的,例如影象資料塊(IDAT),通過識別某些資料塊的標識字串還是比較容易識別出PNG格式的。
--------------------- 本文來自 joqian 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/joqian/article/details/8290389?utm_source=copy