2011-12-21 13 views
5

Tengo varias imágenes, algunas de ellas son png algunas de ellas jpg y gif y quiero mostrarlas en una lista como miniaturas TImageList solo admite iconos ¿Cómo puedo convertirlos para poder insertarlos en TImageList.Convierta png/jpg/gif a ico

estoy usando Delphi XE

+0

esto suena como el suyo http://stackoverflow.com/a/961542/920384 – punker76

+0

IcoFX puede crear e importar imágenes en archivos ICO. – frogb

+3

El 'TImageList' estándar también admite mapas de bits. –

Respuesta

9

Para responder específicamente a la cuestión, también para tomar el cambio de tamaño simple en cuenta (miniaturas), un código de ejemplo:

var 
    Img: TImage; 
    BmImg: TBitmap; 
    Bmp: TBitmap; 
    BmpMask: TBitmap; 
    IconInfo: TIconInfo; 
    Ico: TIcon; 
begin 
    Img := TImage.Create(nil); 
    Img.Picture.LoadFromFile(... 

    BmImg := TBitmap.Create; 
    BmImg.Assign(Img.Picture.Graphic); 
    Img.Free; 

    Bmp := TBitmap.Create; 
    Bmp.SetSize(ImageList1.Width, ImageList1.Height); 
    SetStretchBltMode(Bmp.Canvas.Handle, HALFTONE); 
    StretchBlt(Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, 
       BmImg.Canvas.Handle, 0, 0, BmImg.Width, BmImg.Height, SRCCOPY); 
    BmImg.Free; 

    BmpMask := TBitmap.Create; 
    BmpMask.Canvas.Brush.Color := clBlack; 
    BmpMask.SetSize(Bmp.Width, Bmp.Height); 

    FillChar(IconInfo, SizeOf(IconInfo), 0); 
    IconInfo.fIcon := True; 
    IconInfo.hbmMask := BmpMask.Handle; 
    IconInfo.hbmColor := Bmp.Handle; 

    Ico := TIcon.Create; 
    Ico.Handle := CreateIconIndirect(IconInfo); 

    ImageList1.AddIcon(Ico); 

    Bmp.Free; 
    BmpMask.Free; 
    Ico.Free; // calls DestroyIcon 
end; 

o, sin crear un icono:

var 
    Img: TImage; 
    BmImg: TBitmap; 
    Bmp: TBitmap; 
begin 
    Img := TImage.Create(nil); 
    Img.Picture.LoadFromFile(.. 

    BmImg := TBitmap.Create; 
    BmImg.Assign(Img.Picture.Graphic); 
    Img.Free; 

    Bmp := TBitmap.Create; 
    Bmp.SetSize(ImageList1.Width, ImageList1.Height); 
    SetStretchBltMode(Bmp.Canvas.Handle, HALFTONE); 
    StretchBlt(Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, 
       BmImg.Canvas.Handle, 0, 0, BmImg.Width, BmImg.Height, SRCCOPY); 
    BmImg.Free; 

    ImageList1.AddMasked(Bmp, clNone); 

    Bmp.Free; 
end; 
+0

A menudo recibo la excepción: fuera de los recursos del sistema ¿por qué crees que es eso? – opc0de

+0

@ opc0de, las muestras anteriores funcionan con algunos identificadores de gdi, pero por lo que puedo ver no debe haber fugas. Pero, por supuesto, querrá modificar el código para garantizar la liberación de los objetos vcl, utilizando los bloques try finally. Realmente no puedo decir ... –

+0

Usé una imagen jpeg para volcar la miniatura en el disco después de que reemplacé el jpeg con un bmp dejé de tener ese desagradable error. No hubo fuga, pero no sé ... – opc0de