Delphi 2009中的PNG图像列表和图像

时间:2009-02-10 15:24:23

标签: delphi png delphi-2009 imagelist

D2009为图像和图像列表引入了PNG支持。

...然而

我有一个包含带alpha的png图像的图像列表。我想使用TImage将其中一个放在表单上。我如何做到这一点,并使图像很好地合成?

作为问题的一个例子我面对下面的代码无法正常工作,并产生显示的效果:

ImageList.GetBitmap(index, Image1.Picture.Bitmap);

alt text
(来源:clip2net.com

再解释一下:

在表单上删除Timage,并在设计时使用Picture属性加载带alpha的PNG文件。请注意它是如何在表单上以完全透明的方式正确合成的。

现在,在设计时,添加第二个空的Timage,添加一个TImagelist,并将相同的PNG添加到图像列表中。如何将TImageList中的PNG分配给第二个TImage,并使其看起来与第一个相同?

6 个答案:

答案 0 :(得分:4)

根据我的研究,我发现TImageList将图像存储为TBitmaps,因此alpha信息在存储时丢失,并且使用TImageList的当前实现无法实现您正在寻找的内容。

<强>更新

稍微进行一些实验并使用下面的代码,我可以使透明度与下面的代码一起使用。

ImageList1.ColorDepth := cd32Bit;
Image2.Transparent := True;
Image2.Canvas.Pen.Style := psClear;
Image2.Canvas.Rectangle(0, 0, Image2.Width+1, Image2.Height+1);
ImageList1.Draw(Image2.Canvas, 0,0,0);

但它看起来并不像装载的png那么漂亮。

答案 1 :(得分:2)

检查选项卡中的启用运行时主题 项目 - &gt;选项 - &gt; “应用程序”选项卡

这解决了我在RAD Studio 2010中遇到的问题。

答案 2 :(得分:1)

我刚试了一个简单的测试。 TImageList包含具有透明度的PNG图像。我使用以下方法在第二个TImage上渲染图像:

imlImageList.Draw(img2.Canvas,0,0,0);

让我与众不同的是设置img2.Transparent:= true(我使用的是设计师,而不是代码)。

答案 3 :(得分:1)

我偶然发现了这个讨论主题:

Tranparent PNGs in D2009 TImageList

  

@Pekka Nyyssonen:将ColorDepth设置为cd32Bit,将DrawingStyle设置为dsTransparent   为我工作。

我无法访问delphi 2009,所以我没有尝试过,但是......

答案 4 :(得分:0)

有几种方法可以将透明图像添加到图像列表中。

使用AddMasked或InsertMasked,您可以添加图像并将颜色标记为透明颜色:

procedure InsertMasked(Index: Integer; Image: TBitmap; MaskColor: TColor);
function AddMasked(Image: TBitmap; MaskColor: TColor): Integer;

使用“插入”或“添加”,可以添加图像和蒙版。如果使用2色(黑/白)图像,只使用图像中的白色像素,其他图像是透明的。

function Add(Image, Mask: TBitmap): Integer;
procedure Insert(Index: Integer; Image, Mask: TBitmap);

答案 5 :(得分:0)

据我所知,这是无法实现的。所给出的建议都不会导致正确的alpha混合图像,这是主要要求。

也许通过定义从TImageList派生的类,然后可以访问受保护的方法,可以使用某些东西。我现在的解决方案是专门为此使用第三方自定义ImageList组件。