改變TIcon導出ICO圖標只能是16色的解決辦法

       題記:由於自己想要從EXE導出ICO圖標,一時半會也找不到好的軟件,於是突發奇想自己寫個,於是蒐羅資料寫出小軟件,不過發現有些地方需要記錄下來,以供自己回顧也方便同好查閱,故記錄於此。

大家都知道怎麼用 TICon 從一個 EXE 文件中導出 .ICO 文件,短短几行代碼即可搞定,代碼如下:
uses  ShellAPI;
    ……
procedure TForm1.Button1Click(Sender: TObject);
var 
  icon:TIcon;
begin
    icon:=TIcon.Create;

    icon.Handle:=ExtractIcon(HInstance,PChar('d:/Test.exe'),0);
    Image1.Picture.Icon.Handle := ExtractIcon( Application.Handle, PChar(
'd:/Test.exe'), 0 );
 
    icon.SaveToFile('E:/MySoftTest/Test.ico');   //保存
    Image2.Picture.LoadFromFile('E:/MySoftTest/Test.ico');  //加載預覽

    icon.Free;
end;

一般情況下,icon.SaveToFile('E:/MySoftTest/Test.ico');   //保存 這段執行的結果就是保存的16色的圖標文件,預覽圖標文件明顯看到顏色失真,原因就是 TIcon 的保存成 .ICO 的時候存在的問題。解決辦法步驟如下:

  1、爲了讓TIcon能夠導出256色的.ico圖片,而不是僅僅16色,需要更改 Graphics.pas文件的如下位置
  procedure WriteIcon(Stream: TStream; Icon: HICON; WriteLength: Boolean);
  中的
      InternalGetDIBSizes(IconInfo.hbmColor, ColorInfoSize, ColorBitsSize, 16);
  和
      InternalGetDIB(IconInfo.hbmColor, 0, ColorInfo^, ColorBits^, 16);
  更改爲
      InternalGetDIBSizes(IconInfo.hbmColor, ColorInfoSize, ColorBitsSize, 65536);
  和
      InternalGetDIB(IconInfo.hbmColor, 0, ColorInfo^, ColorBits^, 65536);

注 意:更改的位置就是 16 -->65536 ,這樣導出來的圖標就像xp用的那樣顏色,如果你不用65536非要用256當然也可以,只是導出的圖標還是不那麼的好看,但是明顯是彩色的了,只是認真 比對會發現還是有一點點的不完美,所以乾脆65536,這樣的顏色一點都不失真。

  2、然後在命令行模式下重新編譯 Graphics.pas文件 ,步驟如下:
cmd
cd C:/Program Files/Borland/Delphi7/Source/Vcl
dcc32 Graphics.pas 

3、最後,重新編譯你的程序,也就是用到TIcon的那個程序,然後抓取exe的圖標看看,一切ok了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章