2010-11-19 31 views
8

Necesito agregar en tiempo de ejecución una imagen png a un TImageList. He mirado en las funciones implementadas por la TCustomImageList sino que sólo permiten la adición deAgregue una imagen png a una lista de imágenes en tiempo de ejecución usando Delphi XE

  • mapas de bits,
  • iconos o
  • imágenes de otro imagelist

Ej:

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; 

¿Cómo puedo agregar una imagen PNG a un componente ImageList sin convertir esta imagen a BMP?

El IDE ya se puede añadir un PNG a un ImageList en tiempo de diseño:

enter image description here

Ahora tenemos que hacerlo en tiempo de ejecución.

Respuesta

3

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 a un icono. 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 simplificar el uso de TPngImageList que viene con ese paquete.

1
  • Crear una instancia de TPNGImage, PngImage: PngImage
  • cargar la imagen en este caso, PngImage.LoadFromFile (..)
  • Crear una instancia de TBitmap, mapa de bits: TBitmap
  • Asignar el PNG en el mapa de bits, Bitmap.Assign (PngImage)
  • Agregue el mapa de bits a la lista de imágenes
  • ¡Trabajo hecho!
16

Delphi XE tiene todo el soporte para manejar imágenes png y 32 bit bitmaps con canal alfa. Aquí es cómo agregar png a un 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); 

Debe incluir

ImgList, PngImage

Si ahora trata:

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

verá que las imágenes son lo mismo. En realidad, hay algunas diferencias \ pm 1 rgb debido a errores de redondeo durante la mezcla alfa pero no se pueden ver a simple vista. Descuidando establecer bmp.AlphaFormat: = afIgnored; daría como resultado que la segunda imagen sea ¡mucho más oscura!

Saludos,

Alex

+0

Pon a CommCtrl utiliza la cláusula para hacer ImageList_Add() disponibles. – denim

Cuestiones relacionadas