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

Delphi 2009图像列表和图像中的PNG,delphi,png,delphi-2009,imagelist,Delphi,Png,Delphi 2009,Imagelist,D2009引入了对图像和图像列表的PNG支持 然而 我有一个包含带有alpha的png图像的图像列表。我想用TImage将其中一个放在表单上。我如何做到这一点,并得到图像很好地合成 作为我面临的问题的一个例子,下面的代码无法正常工作,并产生如下所示的效果: ImageList.GetBitmap(index, Image1.Picture.Bitmap); (来源:) 再解释一下: 在窗体上放置一个Timage,并在设计时使用Picture属性加载带有alpha的PNG文件。请注意它是如何正

D2009引入了对图像和图像列表的PNG支持

然而

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

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

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

(来源:)

再解释一下:

在窗体上放置一个Timage,并在设计时使用Picture属性加载带有alpha的PNG文件。请注意它是如何正确地与窗体上的完全透明合成的


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

我刚刚尝试了一个简单的测试。TImageList包含一个透明的PNG图像。我使用以下方法在第二个时间段渲染图像:

绘制(img2.Canvas,0,0,0)


对我来说,区别在于设置img2.Transparent:=true(我使用的是设计器,而不是代码)。

我无意中发现了这个讨论主题:

@Pekka Nyssonen:将ColorDepth设置为CD32位,将DrawingStyle设置为dsTransparent 为我工作


我自己没有访问delphi 2009的权限,所以我没有尝试过,不过…

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

使用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);

根据我的研究,我发现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那么漂亮。

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


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

检查选项卡中的启用运行时主题
项目->选项->应用程序选项卡


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

而且,这显然不像Delphi代码。你确定这门语言吗?我支持前面的两条评论@Ken-关于C++Builder你说得对-我会调整帖子。如果你仍然有原始图像,直接将其重新上传到stackoverflow而不是第三方网站会很有帮助。谢谢。这对我不起作用-我得到的结果与上面所示的相同。您确定您的PNG具有适当的软边透明度吗?根据MS Common Controls库的设计,Alpha透明度在TIMageList中使用时会变成简单的BMP颜色,如同透明一样。这甚至不是Delphi代码,它是Windows自己做的。谢谢,但我正在寻找正确的alpha混合,如左图所示,而不是单位掩码。不,alpha信息没有丢失。您可以将TImagelist与TButtons一起使用,并在按钮上获得适当的透明图示符。此外,位图可以是32 bpp。。。