Добавьте png-изображение в imagelist во время выполнения с помощью Delphi XE

мне нужно добавить во время выполнения png-изображение в TImageList. Я посмотрел на функции, реализованные TCustomImageList но они позволяют только добавлять

  • растровые изображения,
  • значки или
  • изображения из другого imagelist

например:

function Add(Image, Mask: TBitmap): Integer;
function AddIcon(Image: TIcon): Integer;
function AddImage(Value: TCustomImageList; Index: Integer): Integer;
procedure AddImages(Value: TCustomImageList);
function AddMasked(Image: TBitmap; MaskColor: TColor): Integer;

как я могу добавить PNG-изображение в компонент ImageList без преобразования этого изображения в BMP?

IDE уже может добавить PNG в ImageList при проектировании время:

enter image description here

Теперь нам нужно сделать это во время выполнения.

3 ответов


согласно MSDN, imagelist может содержать только растровые изображения и значки. Чтобы добавить png-изображение в imagelist, сначала нужно преобразовать его в значок. Код для этого можно найти в PngComponents пакета. Если у вас есть только png изображений в imagelist С можно для простоты просто использовать TPngImageList этого пакета.


Delphi XE имеет всю поддержку для обработки png-изображений и 32-бит растровые изображения с альфа-каналом. Вот как добавить png в ImageList:

var pngbmp: TPngImage;
    bmp: TBitmap;
    ImageList: TImageList;
begin
  ImageList:=TImageList.Create(Self);
  ImageList.Masked:=false;
  ImageList.ColorDepth:=cd32bit;
  pngbmp:=TPNGImage.Create;
  pngbmp.LoadFromFile('test.png');
  bmp:=TBitmap.Create;
  pngbmp.AssignTo(bmp);
  // ====================================================
  // Important or else it gets alpha blended into the list! After Assign
  // AlphaFormat is afDefined which is OK if you want to draw 32 bit bmp
  // with alpha blending on a canvas but not OK if you put it into
  // ImageList -- it will be way too dark!
  // ====================================================
  bmp.AlphaFormat:=afIgnored;
  ImageList_Add(ImageList.Handle, bmp.Handle, 0);

необходимо указать

ImgList, PngImage

Если вы сейчас попробуете:

  Pngbmp.Draw(Bmp1.Canvas,Rect);
and
  ImageList.Draw(Bmp1.Canvas,0,0,0,true);

вы увидите, что изображения одинаковы. На самом деле, есть несколько \ PM 1 различия rgb из-за ошибок округления при Альфа-смешивании но вы не можете увидеть их невооруженным глазом. Пренебрежение формат BMP.AlphaFormat:=afIgnored; приведет ко второму изображению гораздо темнее!

С уважением,

Алекс


  • создайте экземпляр TPngImage, PngImage: PngImage
  • загрузите изображение в этот экземпляр, PngImage.LoadFromFile(..)
  • создайте экземпляр TBitmap, Bitmap: TBitmap
  • назначьте PNG растровому изображению, Bitmap.Назначить(PngImage)
  • добавить растровое изображение в списке изображений
  • работу!