把图片文件转化为 ICON 文件

发端

用 Delphi 写程序,最终发布的时候,程序的图标,是一个 ICON 文件,文件名后缀是 .ico

我们可以用任何图片编辑工具作图。我比较喜欢用 Paint.net 这个开源软件,简单实用。但 Paint.net 不能把图片保存为 ICON 格式的文件。

问题

如何把图片文件保存为 ICON 格式?

解法

环境

Delphi VCL,以下测试代码是在 Delphi 12 CE 版本上测试通过。

支持的图片文件格式

如果要加载 jpg, png 和 gif 文件,必须:

uses Vcl.Imaging.pngimage, Vcl.Imaging.jpeg, Vcl.Imaging.GIFImg;

完整测试通过的程序

procedure TFmMain.LoadPictureAndToICO(Sender: TObject);
var
  Icon: TIcon;
  Bitmap: TBitmap;
  MaskBitmap: TBitmap;
  IconSize: Integer;
  Fn, DestFile: string;
  IconInfo: TIconInfo;
  IconH: HICON;
begin
  IconSize := 64;
  if OpenDialog1.Execute() then
  begin
    DestFile := TPath.ChangeExtension(OpenDialog1.FileName, 'ico');  //加载的图片文件的扩展名替换为 ico
    Image1.Picture.LoadFromFile(OpenDialog1.FileName);

    MaskBitmap := TBitmap.Create;
    Bitmap := TBitmap.Create;
    try
      Bitmap.PixelFormat := pf32bit;
      Bitmap.HandleType := bmDIB;
      Bitmap.SetSize(IconSize, IconSize);
      Bitmap.Canvas.StretchDraw(Rect(0, 0, IconSize, IconSize), Image1.Picture.Graphic);

        // 创建掩码位图(用于透明部分)
      // 设置MaskBitmap:黑色部分是显示区域,白色部分是透明区域
      MaskBitmap.SetSize(IconSize, IconSize);
      MaskBitmap.PixelFormat := pf1bit;
      MaskBitmap.Canvas.Brush.Color := clWhite;
      MaskBitmap.Canvas.FillRect(Rect(0, 0, IconSize, IconSize));
      MaskBitmap.Canvas.Brush.Color := clBlack;
      MaskBitmap.Canvas.Ellipse(0, 0, IconSize, IconSize);  // 绘制一个黑色的圆形,表示显示区域


        // 配置IconInfo
      IconInfo.fIcon := True;
      IconInfo.xHotspot := 0;
      IconInfo.yHotspot := 0;
      IconInfo.hbmMask := MaskBitmap.Handle;
      IconInfo.hbmColor := Bitmap.Handle;

       // 使用CreateIconIndirect创建图标
      IconH := CreateIconIndirect(IconInfo);

      // 创建图标并分配位图
      Icon := TIcon.Create;
      try
        Icon.Handle := IconH;
        Icon.SaveToFile(DestFile);                    
        Application.Icon.Handle := IConH;
      finally
        Icon.Free;
        DestroyIcon(IconH);
      end;
    finally
      Bitmap.Free;
      MaskBitmap.Free;
    end;
  end;
end;

上面的代码中,使用了 WinAPI.Windows 单元的函数。

结语

上述代码支持加载 BMP, JPG, PNG, GIF 图片,另存为 ICON 图片。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值