程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> 圖標文件格式之單色圖標詳細介紹

圖標文件格式之單色圖標詳細介紹

編輯:更多關於編程

       圖標文件格式有多種,常見的有PNG、ICL、IP,還有就是接下來小編要為大家介紹的ICO格式圖標,ICO格式圖標一種單色圖標,廣泛存在於windows系統中的dll、exe文件中。

    圖標文件格式之單色圖標詳細介紹 三聯

      ICON文件有一個固定的文件頭,它的數據結構如下:

      typedef struct {

      WORD idReserved;

      WORD idType;

      WORD idCount;

      ICONDIRENTRY idEntries[1];

      } ICONDIR, *LPICONDIR;

      其中idReserved為系統保留的字段必須為0

      其中idType為資源類型,1為圖標,2為光標

      其中idCount為ICON圖標資源中包含多個少圖像組成

      其中idEntries是一個指向ICONDIRENTRY結構體的數據它的長度是由idCount來決定的.

      接下來我們看一看ICONDIRENTRY的結構體是如何定義的吧!

      typedef struct {

      BYTE bWidth;

      BYTE bHeight;

      BYTE bColorCount;

      BYTE bReserved;

      WORD wPlanes;

      WORD wBitCount;

      DWORD dwBytesInRes;

      DWORD dwImageOffset;

      } ICONDIRENTRY, *LPICONDIRENTRY;

      又是一長串的結構體...

      *bWidth和bHeight表示了圖像的寬和高,起初,系統只支持1到255的大小,即2^8-1的大小,

      但是從Widnows95開始,可以支持到256的大小了.

      *wBitCount和wPlanes用來描述圖像的顏色深度,對於單色圖標來說,它們都是1.

      *bReserved是系統保留字段為0

      *dwBytesinRes表示圖像數據大小

      *dwImageOffse表示圖像數據的位置即偏移地址.

      *但是有個地方是值得注意的,bColorCount它被假定的認為等於圖像的顏色數量,也就是說它等於:

      bColorCount = 1 << (wBitCount * wPlanes)

      當wBitCount * wPlanes >= 8時,則bColorCount為0

      *在現實情況中,很多人懶得填寫bColorCount的值,即使是4色或16色的圖標,也把它設為0.從Windows XP開始,

      Windows會檢測這個常見的錯誤,但是對於planar位圖來說,這個自動糾錯的機制還是有些問題的,幸運的是,幾乎沒有人使用planar位圖了.

      但是你還是不應該依賴於Windows提供的自動糾錯機制,而正確的填寫bColorCount的值.錯誤的bColorCount意味著,由於提供了錯誤的顏色深度信息,

      Windows可能會在ico文件中選擇一個不怎麼理想的圖像.

      *單色圖標由兩個位圖組成,常稱為掩碼,分別被稱為AND和XOR,繪制圖標分為兩個步驟:首先mask和screen作"與"操作,然後再做"異或"操作.

      pixel = (screen AND mask) XOR image

      為mask和image選擇適當的值,可以覆蓋所有單色blt的操作.

      mask image 結果 操作

      0 0 (screen AND 0) XOR 0 = 0 黑色

      0 1 (screen AND 0) XOR 1 = 1 白色

      1 0 (screen AND 1) XOR 0 = screen 不變

      1 1 (screen AND 1) XOR 1 = NOT screen 反色

      *理論上說,mask指定了image的像素是否拷貝到屏幕上,mask中黑色的像素表示要將image中相應的像素拷貝到屏幕上.

      *mask和image位圖在物理上是保存為單個但是雙倍高度的DIB.首先是image位圖,然後是mask.由於DIB是自下而上的保存格式,

      所以如果你要觀察一個位圖,那麼mask在上面而image在下面).bmp文件格式使用的是數據坐標系,也就是說(0,0)在左下角,

      bmp文件中的數據最開始是最下載一行像素.

      *按照格式,每個圖標的圖像保存為BITMAPINFO結構的形式,根據其中BITMAPINFOHEADER來決定有沒有調色板數據,然後是image的像素數據和mask的像素數據.

      其中biCompression必須為BI_RGB,由於是雙倍高度的位圖,所以biWidth為圖像的寬度,biHeight為圖像高度的兩倍.

      *對於圖標的單色圖標就先寫到這裡...

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved