1. 程式人生 > >png檔案格式詳解【轉】

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個,每個對應調色
板中的一項,00代表透明,FF代表不透明

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