手动修改Icon图标的颜色深度(张佩)
生活随笔
收集整理的這篇文章主要介紹了
手动修改Icon图标的颜色深度(张佩)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
手動修改Icon圖標的顏色深度
-- 張佩
這本是雕蟲小技,但依舊有用,所以寫在這里讓需要的人看。本文要講的是怎樣手動修改Icon圖標的大小和顏色深度。
??????? 問題本身是這樣的:我發現在MFC項目中新建圖標,它的顏色色度永遠都是4bit(即16色),而不是24bit(或0x1000000種顏色)。 解決這個問題最好的辦法是使用ICON軟件,創建或修改ICON圖標。但因為手頭沒有,并由于研究的興趣,我選擇嘗試手動修改Icon文件。在實際操作的過程中,微軟文檔《Icons in Win32》對我極有幫助。另一篇差不多是它的中文翻譯,是《Windows圖標-Icon文件格式分析》,也不錯。
1. ICON頭
和BMP文件相比,ICON文件要再多了一個頭。也就是說,如果把一個16*16或32*32這樣大小的BMP文件,前置一個Icon頭就能變成一個Icon文件了。??????? 下面是Icon頭的結構定義: typedef struct {WORD idReserved; // Reserved (must be 0)WORD idType; // Resource Type (1 for icons)WORD idCount; // How many images?ICONDIRENTRY idEntries[1]; // An entry for each image (idCount) } ICONDIR, *LPICONDIR;???????? 前面是3個word型變量。第一個是保留位(注釋指明,一定是0),第二個為類型變量,Icon因設為1,第三個變量是圖片數量,一張Icon中可以包含多個BMP圖片,對應下面的多個ICONDIRENTRY結構。每個ICONDIRENTRY結構表示一張BMP圖,其結構大小是16Byte。所以ICON頭的總大小為:6+16×idCount。 下面是ICONDIRENTRY結構定義: typedef struct {BYTE bWidth; // Width, in pixels, of the imageBYTE bHeight; // Height, in pixels, of the imageBYTE bColorCount; // Number of colors in image (0 if >=8bpp)BYTE bReserved; // Reserved ( must be 0)WORD wPlanes; // Color PlanesWORD wBitCount; // Bits per pixelDWORD dwBytesInRes; // How many bytes in this resource?DWORD dwImageOffset; // Where in the file is this image? } ICONDIRENTRY, *LPICONDIRENTRY;
??????? 前兩個變量指出了圖像的大小,由于Icon圖片都是長寬相等的,所以一般有16*16,32*32,48*48這幾種。
??????? 最后一個DWORD變量dwImageOffset,指明對應的BMP文件在整個文件中的偏移。可以用二進制編輯軟件打開一個ICON文件后,進行操練。假設某個dwImageOffset值為0X000044E6,移動鼠標到此偏移處,由此開始的一段數據塊,就是一個標準的BMP文件了。我們下面就是要通過這種方法,定位BMP文件后,改變BMP文件的顏色等相關屬性。
??????? 首先確定圖像的Index,即它在ICONDIRENTRY列表中的位置,然后找到其BMP文件在ICON文件中的偏移,并定位到此偏移處等待進一步處理。最簡單的情況是Icon文件中只有一個Bmp圖像,那么Bmp文件的偏移一定總是22。
?????? 2. BMP頭
現在還需再分析BMP文件。BMP文件由頭和體兩個部分組成,我們只要分析其頭結構即可,下面是結構體BITMAPINFOHEADER的定義:typedef struct tagBITMAPINFOHEADER { /* bmih */DWORD biSize;LONG biWidth;LONG biHeight;WORD biPlanes;WORD biBitCount;DWORD biCompression;DWORD biSizeImage;LONG biXPelsPerMeter;LONG biYPelsPerMeter;DWORD biClrUsed;DWORD biClrImportant; } BITMAPINFOHEADER;
表示顏色深度的變量biBitCount位于結構體中的第15個字節。它一般有幾種取值,即4、8、16、24、32,分別代表了各種不同的顏色深度,見得較多的是4,即共能表示16種顏色。改成24后,能表示的顏色范圍變成了16777216(0x1000000)種。 最后兩個DWORD型的變量(偏移31字節)能表示的顏色數量,4色對應0x10,即16色。當我們改成24后,應該把它改成0x1000000,即能表示更多的顏色。也可以把其值改成0,0表示顏色數量無限制,相當于最大。
3. 觀其效
保存圖標文件后重新在VC中打開,到資源里面重新查看Icon屬性,是不是已經改變了?現在可以從畫板中打開一個圖片,挖一塊色彩豐富的圖片粘帖到Icon中,它的顏色就不會失真了。??????? 本文介紹的這種方法,可謂九牛拉一草,大力氣用在小地方。 但技術愛好者處于研究的目地,這種死功夫又往往是必需的。
總結
以上是生活随笔為你收集整理的手动修改Icon图标的颜色深度(张佩)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数值计算方法【学习笔记】——引论
- 下一篇: EPLAN P8.2.7 学习版安装教程