日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

手动修改Icon图标的颜色深度(张佩)

發布時間:2023/12/14 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 手动修改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图标的颜色深度(张佩)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。