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

问题描述 投票:4回答:6

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,并使其看起来与第一个相同?

delphi png delphi-2009 imagelist
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那么漂亮。


2
投票

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

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


1
投票

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

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

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


1
投票

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

Tranparent PNGs in D2009 TImageList

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

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


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

0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.