Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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.

like image 740
Salvador Avatar asked Nov 19 '10 02:11

Salvador


3 Answers

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

like image 167
alex Avatar answered Nov 19 '22 11:11

alex


According to MSDN an imagelist can only contain bitmaps and icons. To add a png image to an imagelist you have to convert it to an icon first. The code to do that can be found in the PngComponents package. If you have only PNG images in your imagelist you can for simplicity just use TPngImageList that comes with that package.

like image 3
Uwe Raabe Avatar answered Nov 19 '22 13:11

Uwe Raabe


  • Create an instance of TPngImage, PngImage: PngImage
  • Load the image into this instance, PngImage.LoadFromFile(..)
  • Create an instance of TBitmap, Bitmap: TBitmap
  • Assign the PNG to the bitmap, Bitmap.Assign(PngImage)
  • Add the bitmap to the image list
  • Job done!
like image 2
David Heffernan Avatar answered Nov 19 '22 12:11

David Heffernan