Добавьте изображение png в список изображений во время выполнения, используя Delphi XE - PullRequest
8 голосов
/ 19 ноября 2010

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

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

например:.

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 ]

18 голосов
/ 06 января 2011

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; приведет к тому, что второе изображение будет намного темнее!

С уважением,

Алекс

3 голосов
/ 19 ноября 2010

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

1 голос
/ 19 ноября 2010
  • Создание экземпляра TPngImage, PngImage: PngImage
  • Загрузить изображение в этот экземпляр, PngImage.LoadFromFile (..)
  • Создание экземпляра TBitmap, Bitmap: TBitmap
  • Назначить PNG для растрового изображения, Bitmap.Assign (PngImage)
  • Добавить растровое изображение в список изображений
  • Работа выполнена!
...