【问题标题】:PNGs in Delphi 2009 Imagelists and ImagesDelphi 2009 图像列表和图像中的 PNG
【发布时间】:2010-10-06 16:12:51
【问题描述】:

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

不过……

我有一个包含带有 alpha 的 png 图像的图像列表。我想使用 TImage 将其中一个放在表单上。我该怎么做才能使图像合成得很好?

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

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


(来源:clip2net.com

再解释一下:

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

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

【问题讨论】:

  • 另外,这肯定不像 Delphi 代码。你确定是语言吗?
  • 我对之前的两场比赛都是第二名。 ;)
  • @Ken - 你对 C++Builder 的看法是对的 - 我会调整帖子。
  • 如果您还有原始图像,直接将其重新上传到 stackoverflow 而不是第三方网站会有所帮助。谢谢。

标签: delphi png delphi-2009 imagelist


【解决方案1】:

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

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

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

【讨论】:

  • 这对我不起作用 - 我得到与上图相同的结果。您确定您的 PNG 具有适当的软边透明度吗?
  • Alpha 透明度在 TIMageList 中使用时变得简单 BMP-color-as-transparent,根据 MS 公共控件库的设计。这甚至不是 Delphi 代码,它是 Windows 本身在做的。
【解决方案2】:

我偶然发现了这个讨论帖:

Tranparent PNGs in D2009 TImageList

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

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

【讨论】:

    【解决方案3】:

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

    使用 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 混合,如左侧图像所示,而不是单位掩码。
    【解决方案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 那样漂亮。

    【讨论】:

    • 不,alpha 信息没有丢失。您可以将 TImagelist 与 TButtons 一起使用,并在按钮上获得适当的透明字形。此外,位图可以是 32 bpp...
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:


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

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

      【讨论】:

        猜你喜欢
        • 2010-09-15
        • 2012-06-13
        • 1970-01-01
        • 2011-05-12
        • 2016-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-17
        相关资源
        最近更新 更多