4

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

然而...

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

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

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

替代文字
(来源:clip2net.com

再解释一下:

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

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

4

6 回答 6

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 那样漂亮。

于 2009-02-16T20:04:14.750 回答
2

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

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

于 2010-09-09T19:06:31.830 回答
1

我偶然发现了这个讨论线程:

D2009 TImageList 中的透明 PNG

@Pekka Nyyssonen:将 ColorDepth 设置为 cd32Bit 并将 DrawingStyle 设置为 dsTransparent 对我有用。

我自己无法访问delphi 2009,所以我没有尝试过,不过......

于 2009-02-13T13:55:16.810 回答
1

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

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

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

于 2009-02-12T21:30:54.540 回答
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);
于 2009-02-14T19:50:07.993 回答
0

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

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

于 2009-02-19T17:48:49.410 回答