我有Color
,我有一个方法应该返回该颜色的更“透明”版本。我尝试了以下方法:
public static Color SetTransparency(int A, Color color)
{
return Color.FromArgb(A, color.R, color.G, color.B);
}
但出于某种原因,无论A
是什么,返回的Color
的透明度级别都不会改变。
有什么想法吗?
答案 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}");