设置透明色

时间:2010-06-11 07:15:48

标签: c# colors

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

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

但出于某种原因,无论A是什么,返回的Color的透明度级别都不会改变。

有什么想法吗?

4 个答案:

答案 0 :(得分:12)

嗯,除了您使用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, Color.Black);
        Console.WriteLine(halfTransparent.A); // Prints 127
    }
}

那里没有惊喜。如果你提供一个简短但完整的程序来证明你所遇到的确切问题,那将会非常有帮助。你确定无论你做什么颜色甚至支持透明度?

请注意,此方法已有效地存在为Color.FromArgb(int, Color)

答案 1 :(得分:4)

只需使用FromArgb的正确重载

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

答案 2 :(得分:0)

您的命名可能存在问题。 我制作了一个标准的Windows窗体项目,有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);
}

答案 3 :(得分:0)

您可以为 Color 类编写一个扩展方法,该方法返回一个新的 Color,带有修改后的 alpha 值,如下所示:

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

Live Demo