D2009为图像和图像列表引入了PNG支持。
...然而
我有一个包含带alpha的png图像的图像列表。我想使用TImage将其中一个放在表单上。我如何做到这一点,并使图像很好地合成?
作为问题的一个例子我面对下面的代码无法正常工作,并产生显示的效果:
ImageList.GetBitmap(index, Image1.Picture.Bitmap);
(来源:clip2net.com)
再解释一下:
在表单上删除Timage,并在设计时使用Picture属性加载带alpha的PNG文件。请注意它是如何在表单上以完全透明的方式正确合成的。
现在,在设计时,添加第二个空的Timage,添加一个TImagelist,并将相同的PNG添加到图像列表中。如何将TImageList中的PNG分配给第二个TImage,并使其看起来与第一个相同?
答案 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组件。