改变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了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值