2010-11-19 50 views
8

Tôi cần thêm thời gian chạy hình ảnh png vào TImageList. Tôi đã xem xét các chức năng được thực hiện bởi TCustomImageList nhưng họ chỉ cho phép thêmThêm hình ảnh png vào hình ảnh trong thời gian chạy bằng Delphi XE

  • bitmap,
  • biểu tượng hoặc
  • hình ảnh từ imagelist khác

Ví dụ:

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; 

Làm thế nào tôi có thể thêm hình ảnh PNG vào thành phần ImageList mà không cần chuyển đổi hình ảnh này sang BMP?

Các IDE đã có thể thêm một PNG để một ImageList lúc thiết kế:

enter image description here

Bây giờ chúng ta cần phải làm điều đó khi chạy.

Trả lời

3

Theo MSDN, người tạo hình ảnh chỉ có thể chứa bitmap và biểu tượng. Để thêm một hình ảnh png vào một imagelist, bạn phải chuyển nó thành một biểu tượng đầu tiên. Mã để làm điều đó có thể được tìm thấy trong gói PngComponents. Nếu bạn chỉ có hình ảnh PNG trong imagelist của bạn, bạn có thể đơn giản chỉ cần sử dụng TPngImageList đi kèm với gói đó.

1
  • Tạo một thể hiện của TPngImage, PngImage: PngImage
  • tải hình ảnh vào trường hợp này, PngImage.LoadFromFile (..)
  • Tạo một thể hiện của TBitmap, Bitmap: TBitmap
  • Gán PNG vào bitmap, Bitmap.Assign (PngImage)
  • Thêm bitmap vào danh sách ảnh
  • Hoàn thành công việc!
16

Delphi XE có tất cả hỗ trợ để xử lý hình ảnh png và 32 bit bitbitmap với kênh alpha. Dưới đây là làm thế nào để thêm png để một 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); 

Bạn phải bao gồm

ImgList, PngImage

Nếu bây giờ bạn thử:

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

bạn sẽ thấy rằng những hình ảnh giống nhau. Trên thực tế, có một vài sự khác biệt giữa \ pm 1 rgb do lỗi làm tròn trong khi trộn alpha nhưng bạn không thể nhìn thấy chúng bằng mắt thường. Bỏ qua để đặt bmp.AlphaFormat: = afIgnored; sẽ dẫn đến hình ảnh thứ hai là tối hơn nhiều!

Trân trọng,

alex

+0

Đặt CommCtrl để sử dụng khoản để thực hiện ImageList_Add() có sẵn. – denim

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