現在有很多圖標采用的都是ico格式,ico圖標文件可以存儲單個圖案,也可以存儲多尺寸、多色板。下面我們就來了解下ico圖標文件格式構成。
圖標文件格式
圖標文件(*.ico)由圖標文件頭、圖片入口數據和圖片數據三個部分組成,這三個部分的具體結構如下:
1. 圖標文件頭
圖標文件頭包括三個部分6個字節,他們分別是
數據類型
字節
含義
說明
WORD
2
保留字段(wReserved)
必須0
WORD
2
文件類型(wType)
必須1
WORD
2
圖片數量(wCount)
表示該圖標文件包含多少個圖片
2. 圖片入口
接下來是wCount個“圖片入口”數據。每個“圖片入口”數據結構如下:
數據類型
字節
含義
說明
BYTE
1
圖像寬度(bWidth)
單位:像素。256px的圖片該值為0
BYTE
1
圖像高度(bHeight)
同上
BYTE
1
顏色數(bClrCount)
不重要
BYTE
1
保留字段(bReserved)
必須為0
WORD
2
平面數(wPlanes)
一般為1
WORD
2
比特數(wBitCount)
顏色深度,取值4位、8位、24位和32位
DWORD
4
數據大小(dwImageSize)
對應圖片數據占用的字節數
DWORD
4
數據位置(dwOffset)
對應圖片數據在文件中的位置
3. 圖片數據
對於256X256像素的圖片,在文件中存儲的格式是PNG,只要將整個PNG文件寫在數據區就可以了,對應前面的圖片入口的數據大小(dwImageSize)也是PNG文件的大小。但是XP操作系統不認該圖片。
對於其他圖片,該區域存放了一個目標顏色深度(wBitCount)的數據位圖後面跟一個對應的遮罩位圖。系統在繪制圖標時會先將遮罩位圖與目標設備“與”拷貝(SRCAND),然後在把數據位圖與目標設備“異或”拷貝(SRCINVERT)。
數據位圖的顏色深度可以是4位16色、8位256色、24位真彩色或32位帶Alpha通道。需要注意的是就算是32位帶Alpha通道的位圖也是需要遮罩位圖的。
遮罩位圖是一個1位顏色深度的2值位圖,有圖像的位置填0,透明的位置填1。
數據位圖的結構與普通位圖結構基本相似,但是缺少14位的位圖文件頭。具體包含位圖信息頭、顏色表(只有4位和8位的位圖才會有,4位的位圖顏色表長度為16X4=64字節,8位的位圖顏色表長度為256X4=1024字節)和數據區。
位圖信息頭結構如下:
數據類型
字節
含義
說明
DWORD
4
結構大小(biSize)
固定為40
LONG
4
圖像寬度(biWidth)
單位:像素
LONG
4
圖像高度(biHeight)
單位:像素。由於還有遮罩因此要X 2
WORD
2
平面數(biPlanes)
一般為1
WORD
2
比特數(biBitCount)
顏色深度,取值4位、8位、24位和32位
DWORD
4
壓縮(biCompression)
一般為0
DWORD
4
數據大小(biSizeImage)
LONG
4
分辨率(biXPelsPerMeter)
LONG
4
分辨率(biYPelsPerMeter)
DWORD
4
使用顏色(biClrUsed)
DWORD
4
重要顏色(biClrImportant)
獲取數據位圖可以用如下辦法:
先利用CImage類創建一個目標大小和顏色深度的位圖。注意:4位和8位的位圖需要設置顏色表,不然無法從源圖片復制數據,顏色表可以采用固定的數據。32位位圖需要開啟Alpha通道,不然無法復制Alpha通道的數據。
然後利用CImage::GetDC、CImage::ReleaseDC、CImage:: GetPixelAddress和CImage::Draw等函數從源圖復制圖像數據到該位圖。
接著將該位圖保存到一個臨時位圖文件中。從該文件中讀取。