2011-12-21 40 views
5

Tôi có nhiều hình ảnh trong số đó là png một số trong số đó jpg và gif và tôi muốn hiển thị chúng trong listview dưới dạng thumbs TImageList chỉ hỗ trợ các biểu tượng như thế nào tôi có thể chuyển đổi chúng để có thể chèn chúng vào TImageList.Chuyển đổi png/jpg/gif thành ico

Tôi đang sử dụng Delphi XE

+0

điều này nghe giống như của bạn http://stackoverflow.com/a/961542/920384 – punker76

+0

IcoFX có thể tạo và nhập hình ảnh vào tệp ICO. – frogb

+3

Chuẩn 'TImageList' cũng hỗ trợ bitmap. –

Trả lời

9

Để trả lời cụ thể câu hỏi, cũng để có thay đổi kích thước đơn giản vào tài khoản (đối với hình thu nhỏ), một số mã ví dụ:

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; 

hay, mà không tạo ra một biểu tượng:

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

Tôi thường nhận được ngoại lệ: Ngoài tài nguyên hệ thống, tại sao bạn nghĩ vậy? – opc0de

+0

@ opc0de, các mẫu ở trên hoạt động với một vài xử lý gdi, nhưng theo như tôi có thể thấy không có rò rỉ. Nhưng tất nhiên bạn sẽ muốn sửa đổi mã để đảm bảo giải phóng các đối tượng vcl, bằng cách sử dụng thử các khối cuối cùng. Tôi không thể thực sự nói .. –

+0

Tôi đã sử dụng một hình ảnh jpeg để đổ hình thu nhỏ trên đĩa sau khi tôi thay thế jpeg bằng một bmp tôi đã ngừng nhận được lỗi khó chịu đó. Không có rò rỉ nhưng tôi không biết ... – opc0de

Các vấn đề liên quan