将png / jpg / gif转换为ico

5

我有多张图片,其中一些是png格式,一些是jpg和gif格式,我想在列表视图中显示它们作为缩略图。TImageList仅支持图标,我该如何将它们转换为能够插入TImageList的格式。

我正在使用Delphi XE。


这听起来像是您的问题 https://dev59.com/5nNA5IYBdhLWcg3wcdZk#961542 - punker76
3
标准的 TImageList 也支持位图。 - Ondrej Kelle
1
ImageList不需要图标,它可以很好地加载.bmp文件。而且,链接的问题应该可以解决你的问题。 - Johan
1
可能是Load Jpg/Gif/Bitmap and convert to Bitmap的重复问题。 - Johan
2
@Johan,当涉及到细节时,转换为BMP和ICO是两件不同的事情。即使某些答案和评论可能重叠,我也不认为这是重复的。 - Uwe Raabe
显示剩余3条评论
1个回答

9
为了回答这个问题,同时考虑到简单的缩略图调整大小,以下是一些示例代码:

var
  Img: TImage;
  BmImg: TBitmap;
  Bmp: TBitmap;
  BmpMask: TBitmap;
  IconInfo: TIconInfo;
  Ico: TIcon;
begin
  Img := TImage.Create(nil);
  Img.Picture.LoadFromFile(...

  BmImg := TBitmap.Create;
  BmImg.Assign(Img.Picture.Graphic);
  Img.Free;

  Bmp := TBitmap.Create;
  Bmp.SetSize(ImageList1.Width, ImageList1.Height);
  SetStretchBltMode(Bmp.Canvas.Handle, HALFTONE);
  StretchBlt(Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height,
              BmImg.Canvas.Handle, 0, 0, BmImg.Width, BmImg.Height, SRCCOPY);
  BmImg.Free;

  BmpMask := TBitmap.Create;
  BmpMask.Canvas.Brush.Color := clBlack;
  BmpMask.SetSize(Bmp.Width, Bmp.Height);

  FillChar(IconInfo, SizeOf(IconInfo), 0);
  IconInfo.fIcon := True;
  IconInfo.hbmMask := BmpMask.Handle;
  IconInfo.hbmColor := Bmp.Handle;

  Ico := TIcon.Create;
  Ico.Handle := CreateIconIndirect(IconInfo);

  ImageList1.AddIcon(Ico);

  Bmp.Free;
  BmpMask.Free;
  Ico.Free;  // calls DestroyIcon
end;

或者,无需创建图标:

var
  Img: TImage;
  BmImg: TBitmap;
  Bmp: TBitmap;
begin
  Img := TImage.Create(nil);
  Img.Picture.LoadFromFile(..

  BmImg := TBitmap.Create;
  BmImg.Assign(Img.Picture.Graphic);
  Img.Free;

  Bmp := TBitmap.Create;
  Bmp.SetSize(ImageList1.Width, ImageList1.Height);
  SetStretchBltMode(Bmp.Canvas.Handle, HALFTONE);
  StretchBlt(Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height,
              BmImg.Canvas.Handle, 0, 0, BmImg.Width, BmImg.Height, SRCCOPY);
  BmImg.Free;

  ImageList1.AddMasked(Bmp, clNone);

  Bmp.Free;
end;

我经常遇到异常:系统资源不足,你认为是什么原因? - opc0de
@opc0de,上面的示例使用了一些GDI句柄,但据我所见应该不会有泄漏。但是您当然希望修改代码以确保释放VCL对象,使用try finally块。我无法确定... - Sertac Akyuz
我使用了一个 JPEG 图像将缩略图转储到磁盘上,但在我用 BMP 替换 JPEG 后,我不再遇到那个讨厌的错误了。虽然没有泄漏,但我不知道…… - opc0de

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接