如何消除“光环”在具有透明背景的图像中

发布于 2024-08-22 05:13:06 字数 344 浏览 6 评论 0 原文

我正在使用 DrawImage() 在具有透明背景的表单上绘制一些图像。那些部分透明的图像会导致“光环”效果。(查看屏幕截图)

防止这种情况发生的最佳方法是什么

alt text http://www.imagechicken.com/uploads/1266798081003158300.png

编辑

这些相同的图标在我的桌面上看起来很棒,所以应该有更好的方法绘制图标。

I'm using DrawImage() to paint some images on a form with transparent background. Those images which are partly transparent cause a "halo" effect.(Look at the screenshot)

What's the best way to prevent that from happening

alt text http://www.imagechicken.com/uploads/1266798081003158300.png

EDIT

These same icons look great on my desktop so there should be some better way of painting the icons.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦里°也失望 2024-08-29 05:13:06

这可能是由双重渲染引起的 - 图标渲染到透明表单上,然后表单渲染在背景上。在图标仅部分透明的任何地方,表单都会失去其所有透明度。

也许您可以对表单进行更改以支持部分透明而不是二进制。

It's probably being caused by double rendering - the icon is rendering onto your transparent form, then the form is rendering over the background. Anyplace where your icon is only partially transparent, the form is losing all of its transparency.

Perhaps there is a change you can make to the form to support partial transparency rather than binary.

怎会甘心 2024-08-29 05:13:06

源图像是完整的 Alpha 还是具有透明颜色/一位 Alpha 蒙版?一位 Alpha 图像通常采用背景颜色(通常为白色),然后逐渐淡入背景颜色。您的图像看起来与在非白色背景上绘制一位 alpha 图像时所获得的图像完全相同。


如果您使用一位透明度键,您会得到一个“光环”,或者更确切地说,部分透明值与表单背景颜色的混合。因此,“光环”在这种形式中是粉红色的:

public  class Form1 : Form
{
    Image newImage;

    public Form1()
    {
        this.BackColor = Color.Pink;
        this.ClientSize = new Size(168, 168);
        this.TransparencyKey = this.BackColor;

        newImage = Image.FromFile(Path.Combine(
               Environment.GetFolderPath(Environment.SpecialFolder.MyPictures),
               "dot-mac-logo.png"));
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        e.Graphics.DrawImage(newImage, 20, 20);
    }
}

因此,不要对完整的 alpha 图像使用位透明度 - 我不太确定如何在 C# 中做到这一点,但在 C 中,您将使用 UpdateLayeredWindow MSDN 我之前制作的,用于指定关闭之间的 alpha 混合-屏幕DC和窗口表面。

有一个使用 C# UpdateLayeredWindow 的示例>在此 MSDN 博客上

Is the source image full alpha or does it have a transparent colour/one bit alpha mask? It's common for one-bit alpha images to assume a background colour, often white and just fade to that. Your image looks exactly like what you get if you draw a one-bit alpha image on a non-white background.


If you use the one-bit transparency key, you get a 'halo', or rather mixing of the partially transparent values with the forms background color. So the 'halo' is pink in this form:

public  class Form1 : Form
{
    Image newImage;

    public Form1()
    {
        this.BackColor = Color.Pink;
        this.ClientSize = new Size(168, 168);
        this.TransparencyKey = this.BackColor;

        newImage = Image.FromFile(Path.Combine(
               Environment.GetFolderPath(Environment.SpecialFolder.MyPictures),
               "dot-mac-logo.png"));
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        e.Graphics.DrawImage(newImage, 20, 20);
    }
}

So don't use on-bit transparency with full alpha images - I'm not quite sure how to do it in C#, but in C you would use UpdateLayeredWindow MSDN one I made earlier to specify an alpha blend between an off-screen DC and the window surface.

There's a sample of using UpdateLayeredWindow from C# on this MSDN blog.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文