Add a png image to a imagelist in runtime using Delphi XE

Salvador picture Salvador · Nov 19, 2010 · Viewed 17.6k times · Source

I need add in runtime a png image to a TImageList. I've looked at the functions implemented by the TCustomImageList but they only allow adding

  • bitmaps,
  • icons or
  • images from another imagelist

E.g.:

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;

How I can add a PNG image to a ImageList component without converting this image to BMP?

The IDE already can add a PNG to an ImageList at design time:

enter image description here

Now we need to do it at runtime.

Answer

alex picture alex · Jan 6, 2011

Delphi XE has all the support to handle png images and 32-bit bitmaps with alpha channel. Here is how to add png to an ImageList:

uses CommCtrl;

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);

You must include

ImgList, PngImage

If you now try:

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

you'll see that the images are the same. Actually, there are a few \pm 1 rgb differences due to rounding errors during alpha blending but you cannot see them with naked eye. Neglecting to set bmp.AlphaFormat:=afIgnored; would result in the second image being much darker!

Best regards,

alex