我有一个Color
对象,并且我有一个方法,应该返回该颜色的更“透明”的版本。我尝试了以下方法:
public static Color SetTransparency(int A, Color color)
{
return Color.FromArgb(A, color.R, color.G, color.B);
}
但是不知道为什么,无论A
是什么,返回的Color
透明度都不会改变。
有任何想法吗?
在我看来,这段代码似乎没问题,除了你使用了 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)
。
只需使用正确的 FromArgb 重载即可。
var color = Color.FromArgb(50, Color.Red);
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}");
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);
}
SetTransparency
返回的颜色,但是在我的控件中它不起作用,很奇怪。 - GravitonColor.R
实际上是color.R
,我已经修复了它。 - Graviton