2010-11-19 4 views
8

Мне нужно добавить во время выполнения png-изображение к TImageList. Я посмотрел на функции, реализованные TCustomImageList, но они только позволяют добавлятьДобавить изображение png в imagelist во время выполнения с помощью Delphi XE

  • растровых изображений,
  • иконки или
  • изображений из другого ImageList

Например:

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; 

Как я могу добавить PNG-изображение к компоненту ImageList без преобразования этого изображения в BMP?

В среде IDE уже может добавить PNG к ImageList во время разработки:

enter image description here

Теперь мы должны сделать это во время выполнения.

ответ

3

В соответствии с MSDN мэнимаст может содержать только растровые изображения и значки. Чтобы добавить png-изображение в изображение, вы должны сначала преобразовать его в значок. Код для этого можно найти в пакете PngComponents. Если у вас есть только изображения PNG в вашем мьюзик-листе, вы можете для простоты просто использовать TPngImageList, который поставляется с этим пакетом.

1
  • Создать экземпляр TPngImage, PngImage: PngImage
  • загрузки изображения в этом случае, PngImage.LoadFromFile (..)
  • Создать экземпляр TBitmap, Bitmap: TBitmap
  • Назначение PNG к растровому изображению, Bitmap.Assign (PngImage)
  • Добавить растровое изображение в список изображений
  • Работа выполнена!
16

Delphi XE имеет всю поддержку для обработки изображений png и 32-разрядных растровых изображений с альфа-каналом. Вот как добавить PNG к 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); 

Вы должны включить

ImgList, PngImage

Если теперь попробовать:

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

вы увидите, что изображение одинаковы. На самом деле, существует несколько ошибок \ pm 1 rgb из-за ошибок округления при альфа-смешении , но вы не можете видеть их невооруженным глазом. Пренебрежение установкой bmp.AlphaFormat: = afIgnored; приведет к тому, что второе изображение будет намного темнее!

С наилучшими пожеланиями,

Алекс

+0

Поместите CommCtrl в пункт используется, чтобы сделать ImageList_Add() доступны. – denim