发端
用 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 图片。
975

被折叠的 条评论
为什么被折叠?



