D2009为图像和图像列表引入了PNG支持。
然而...
我有一个包含带alpha的png图像的图像列表。我想使用TImage将其中一个放在表单上。我如何做到这一点并使图像很好地合成?
作为问题的一个例子我面对下面的代码无法正常工作,并产生显示的效果:
ImageList.GetBitmap(index, Image1.Picture.Bitmap);
(来源:clip2net.com)
再解释一下:
在表单上删除Timage,并在设计时使用Picture属性加载带alpha的PNG文件。请注意它是如何在表单上以完全透明的方式正确合成的。
现在,在设计时,添加第二个空的Timage,添加一个TImagelist,并将相同的PNG添加到图像列表中。如何将TImageList中的PNG分配给第二个TImage,并使其看起来与第一个相同?
根据我的研究,我发现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那么漂亮。
检查选项卡中的启用运行时主题 项目 - >选项 - >应用程序选项卡
这解决了我在RAD Studio 2010中遇到的问题。
我刚试了一个简单的测试。 TImageList包含具有透明度的PNG图像。我使用以下方法在第二个TImage上渲染图像:
imlImageList.Draw(img2.Canvas,0,0,0);
让我与众不同的是设置img2.Transparent:= true(我使用的是设计师,而不是代码)。
我偶然发现了这个讨论主题:
Tranparent PNGs in D2009 TImageList
@Pekka Nyyssonen:将ColorDepth设置为cd32Bit,将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);
据我所知,这是无法实现的。所给出的建议都不会导致正确的alpha混合图像,这是主要要求。
也许通过定义从TImageList派生的类,然后可以访问受保护的方法,可以使用某些东西。我现在的解决方案是专门为此使用第三方自定义ImageList组件。