Solución:
Delphi XE tiene todo el soporte para manejar imágenes png y mapas de bits de 32 bits con canal alfa. A continuación se explica cómo agregar png a un 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);
Debes incluir
ImgList, PngImage
Si lo intentas ahora:
Pngbmp.Draw(Bmp1.Canvas,Rect);
and
ImageList.Draw(Bmp1.Canvas,0,0,0,true);
verás que las imágenes son las mismas. En realidad, hay algunas diferencias en pm 1 rgb debido a errores de redondeo durante la combinación alfa, pero no se pueden ver a simple vista. Descuidando establecer bmp.AlphaFormat: = afIgnored; daría como resultado que la segunda imagen fuera mucho más oscura.
Atentamente,
Alex
Según MSDN, una lista de imágenes solo puede contener mapas de bits e iconos. Para agregar una imagen png a una lista de imágenes, primero debe convertirla en un ícono. El código para hacer eso se puede encontrar en el paquete PngComponents. Si solo tiene imágenes PNG en su lista de imágenes, puede, por simplicidad, usar TPngImageList que viene con ese paquete.