设置透明颜色

11

我有一个Color对象,并且我有一个方法,应该返回该颜色的更“透明”的版本。我尝试了以下方法:

public static Color SetTransparency(int A, Color color)
{
   return Color.FromArgb(A, color.R, color.G, color.B);
}

但是不知道为什么,无论A是什么,返回的Color透明度都不会改变。

有任何想法吗?


你是如何使用“Color”?问题可能就出在那里。 - strager
1
这应该可以工作,但你在哪里使用颜色?有些控件不支持透明度值。 - lc.
@strager,我正在使用通过SetTransparency返回的颜色,但是在我的控件中它不起作用,很奇怪。 - Graviton
代码无法编译(因为您在其中使用了Color而非color),所以您无法从该方法中获得任何内容。您应该展示您实际使用的代码。通过查看您未使用的其他代码来查找您正在使用的代码中的错误是非常困难的... - Guffa
@Guffa,这实际上是我使用的代码。Color.R 实际上是 color.R,我已经修复了它。 - Graviton
@Ngu:那么问题在方法之外,因为它确实生成了具有指定 alpha 值的颜色。您必须展示如何使用该方法。(实际上,该方法完全是多余的,因为它与已经存在的“Color.FromArgb(int, Color)”方法相同。) - Guffa
4个回答

20

在我看来,这段代码似乎没问题,除了你使用了 Color.R 而不是 color.R——你确定你实际上正在使用返回的 Color 而不是假设它会更改现有颜色吗?你是如何确定“透明度”不会改变的呢?

这里有一个示例,显示返回的颜色中 alpha 值确实正确:

using System;
using System.Drawing;

class Test
{
    static Color SetTransparency(int A, Color color)
    {
        return Color.FromArgb(A, color.R, color.G, color.B);
    }
    
    static void Main()
    {
        Color halfTransparent = SetTransparency(127, Colors.Black);
        Console.WriteLine(halfTransparent.A); // Prints 127
    }
}

没有太大的惊喜。如果您提供一个简短但完整的程序,演示您所遇到的确切问题,那将非常有帮助。您确定您正在处理的颜色甚至支持透明度吗?

请注意,这种方法实际上已经存在,作为Color.FromArgb(int, Color)


是的,我正在使用返回的“Color”。 - Graviton
我认为可能我使用的组件有问题。我会询问组件提供者并查看。 - Graviton

5

只需使用正确的 FromArgb 重载即可。

var color = Color.FromArgb(50, Color.Red);

0
你可以为 Color 类编写一个扩展方法,以返回一个具有修改后 alpha 值的新 Color,如下所示:
public static class ColorExtensions
{
    public static Color WithOpacity(this Color color, double opacity)
    {
        return Color.FromArgb((int)(opacity * 255), color);
    }
}

使用方法

var orange = Color.Orange;
var orange1 = orange.WithOpacity(0.5);

Console.WriteLine($@"R={orange.R} G={orange.G} B={orange.B} A={orange.A}");
Console.WriteLine($@"R={orange1.R} G={orange1.G} B={orange1.B} A={orange1.A}");

演示现场


0
可能你的命名有问题。 我创建了一个标准的 Windows Forms 项目,其中包含2个按钮和一些代码。当单击按钮时,它们各自的颜色确实会逐渐消失。
我同意 Jon Skeet 的看法,你正在实现一个重复的方法,此外所有参数名称都应以小写字母开头,所以应该使用 'a' 而不是 'A'
代码:
private void Form1_Load(object sender, EventArgs e)
{
    button1.BackColor = Color.Red;
    button2.BackColor = Color.Green;
}

private void button1_Click(object sender, EventArgs e)
{
    Color c = button1.BackColor;
    button1.BackColor = Color.FromArgb(Math.Max(c.A - 10, (byte)0), c.R, c.G, c.B);
}

private void button2_Click(object sender, EventArgs e)
{
    Color c = button2.BackColor;
    button2.BackColor = Color.FromArgb(Math.Max(c.A - 10, (byte)0), c.R, c.G, c.B);
}

public static Color SetTransparency(int a, Color color)
{
    return Color.FromArgb(a, color.R, color.G, color.B);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接