Delphi 2009 图像列表和图像中的 PNG
D2009 引入了对图像和图像列表的 PNG 支持。
但是...
我有一个包含带有 alpha 的 png 图像的图像列表。 我想使用 TImage 将其中之一放置在表单上。 我该如何做到这一点并得到很好的合成图像?
作为我面临的问题的一个例子,下面的代码无法正常工作,并产生所示的效果:
ImageList.GetBitmap(index, Image1.Picture.Bitmap);
(来源:clip2net.com)
进一步解释一下:
将 Timage 拖放到窗体上,然后在设计时,使用 Picture 属性加载带有 alpha 的 PNG 文件。 请注意它是如何以完全透明的方式正确合成到表单上的。
现在,在设计时,添加第二个空 Timage,添加 TImagelist,并将相同的 PNG 添加到图像列表。 如何将 TImageList 中的 PNG 分配给第二个 TImage,并使其看起来与第一个 TImage 相同?
D2009 introduces PNG support for Images and Imagelists.
However...
I have an imagelist containing png images with alpha. I want to place one of these on a form using a TImage. How do I do this and get the image nicely composited?
As an example of the problem I'm facing the code below fails to work correctly, and produces the effect shown:
ImageList.GetBitmap(index, Image1.Picture.Bitmap);
(source: clip2net.com)
To explain a bit more:
Drop a Timage on a form, and at design time, load a PNG file with alpha using the Picture property. Note how it is correctly composited with full transparency onto the form.
Now, at design time, add a second empty Timage, add a TImagelist, and add the same PNG to the imagelist. How can I assign the PNG in the TImageList to the second TImage, and have it look identical to the first one?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
根据我的研究,我发现 TImageList 将图像存储为 TBitmap,因此 alpha 信息在存储中丢失,并且您无法使用 TImageList 的当前实现来实现您正在寻找的内容。
更新:
再做一点实验,通过下面的代码,我可以使用下面的代码来实现透明度。
但它看起来并不像加载的 png 那样漂亮。
From my research I found that TImageList stores the images as TBitmaps, so the alpha information is lost on storage, and you can't achieve what you're looking for with the current implementation of TImageList.
Update:
A little more experiments and with the code below i could make transparency work with the code below.
But it didn't look as pretty as a loaded png.
检查
选项卡中的启用运行时主题
项目 -> 选项-> 应用程序选项卡
这解决了我在 RAD Studio 2010 中的问题。
Check the Enable Runtime Themes in the tab at
Project -> Options -> Application tab
This solved my problem for me in RAD Studio 2010.
我只是尝试了一个简单的测试。 TImageList 包含具有透明度的 PNG 图像。 我使用以下方法在第二个 TImage 上渲染图像:
imlImageList.Draw(img2.Canvas, 0, 0, 0);
对我来说与众不同的是设置 img2.Transparent := true (我使用了设计器,而不是代码)。
I just tried a simple test. TImageList contains a PNG image with transparency. I render the image on the second TImage using:
imlImageList.Draw(img2.Canvas, 0, 0, 0);
What made the difference for me was setting img2.Transparent := true (I used the designer, not code).
我偶然发现了这个讨论线程:
Tranparent PNGs in D2009 TImageList
我自己无法访问delphi 2009,所以我还没有尝试过......
I stumbled over this discussion-thread:
Tranparent PNGs in D2009 TImageList
I don't have access to delphi 2009 my self so I havn't tried it out, though...
有多种方法可以将透明图像添加到图像列表中。
使用 AddMasked 或 InsertMasked,您可以添加图像并将颜色标记为透明颜色:
使用 Insert 或 Add,您可以添加图像和蒙版。 如果是 2 色(黑/白)图像,则遮罩仅使用图像中的白色像素,其他像素是透明的。
There are several ways to add transparent images to an image list.
With AddMasked or InsertMasked, you add an image and tags a color to be the transparent color:
With Insert or Add, you add an image and a mask. The mask if a 2 color (black/white) image where only the white pixels from the image are used, the others are transparent.
据我所知,这是不可能实现的。 给出的建议都不会产生正确的 alpha 混合图像,而这是主要要求。
也许通过定义一个从 TImageList 派生的类,然后它可以访问受保护的方法,某些东西就可以工作了。 我现在的解决方案是专门为此使用第三方自定义 ImageList 组件。
To the best of my knowledge, this cannot be acheived. None of the suggestions given result in a properly alpha-blended image, which is the primary requirement.
Maybe by defining a class derived from TImageList, which can then access protected methods, something could be got to work. My solution for now is to use a third-party custom ImageList component specifically for this.