
圖標(ICO)是電腦中極常見的圖片格式:資料夾、軟件、瀏覽器、文件圖標充斥每個角落。ICO 文件擁有固定文件頭,數據結構如下:
typedef struct {
WORD idReserved; // 系統保留,必須為 0
WORD idType; // 資源類型:1=圖標,2=光標
WORD idCount; // 包含圖像數量
ICONDIRENTRY idEntries[1]; // 指向 ICONDIRENTRY 結構體數組
} ICONDIR, *LPICONDIR;
typedef struct {
BYTE bWidth; // 圖像寬度(1-255,Win95 起支援 256)
BYTE bHeight; // 圖像高度
BYTE bColorCount; // 顏色數量 = 1 << (wBitCount * wPlanes),≥8 時為 0
BYTE bReserved; // 系統保留,為 0
WORD wPlanes; // 色盤數,單色圖標為 1
WORD wBitCount; // 每像素位數,單色圖標為 1
DWORD dwBytesInRes; // 圖像數據大小
DWORD dwImageOffset; // 圖像數據偏移地址
} ICONDIRENTRY, *LPICONDIRENTRY;
關鍵點:
bColorCount 常被忽略填 0,XP 起系統會自動糾錯,但 planar 位圖仍有問題。建議正確填寫,否則 Windows 可能選擇不理想圖像。pixel = (screen AND mask) XOR image。mask 指定 image 像素是否拷貝到屏幕,mask 黑色像素表示拷貝對應 image 像素。biCompression 必須為 BI_RGB,biHeight 為圖像高度兩倍。單色圖標核心結構與渲染邏輯到此結束。掌握這些底層細節,有助於理解圖標顯示異常排查與跨平台兼容性優化。