Добавьте 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 при проектировании время:
Теперь нам нужно сделать это во время выполнения.
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)
- добавить растровое изображение в списке изображений
- работу!