图标文件格式详解
圖標文件(*.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) | 單位:像素。由于還有遮罩因此要X2 |
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等函數從源圖復制圖像數據到該位圖。
接著將該位圖保存到一個臨時位圖文件中。從該文件中讀取
總結
- 上一篇: 牧野诡事第二季百度网盘(牧野诡事第二季)
- 下一篇: ​RemoteIE怎