有什么方法可以简化这一行代码?真的需要两次致电Color.FromArgb()
吗?
Color c = Color.FromArgb(255, Color.FromArgb(Convert.ToInt32(rand.Next(0x1000000))));
没有重复的Color.FromArgb()
通话,我只会得到Alpha=0
种颜色。
参考文献:
答案 0 :(得分:3)
只需在LinqPad中尝试过,它似乎可以解决问题:
var random = new Random();
System.Drawing.Color c;
unchecked
{
var n = (int)0xFF000000 + (random.Next(0xFFFFFF) & 0x7F7F7F);
Console.WriteLine($"ARGB: {n}");
c = System.Drawing.Color.FromArgb(n);
}
Console.WriteLine($"A: {c.A}");
Console.WriteLine($"R: {c.R}");
Console.WriteLine($"G: {c.G}");
Console.WriteLine($"B: {c.B}");
更简洁地说,应该是:
var random = new Random();
Color c;
unchecked
{
c = Color.FromArgb((int)0xFF000000 + (random.Next(0xFFFFFF) & 0x7F7F7F));
}
或者如果您想通过位操作变得特别时髦(这不是更有效,只需保存一些0)即可:
c = Color.FromArgb((int)(0xFF << 24 ^ (random.Next(0xFFFFFF) & 0x7F7F7F)));
原始海报指出,多余的一对括号消除了对未经检查的需求:
c = Color.FromArgb((int)(0xFF000000 + (random.Next(0xFFFFFF) & 0x7F7F7F)));
一点解释。 ARGB使用带符号的32位int表示四个字节,A,R,G和B。我们希望颜色是纯色的,因此A需要为255,因此: 0xFF000000 然后random.Next(0xFFFFFF)生成一个伪随机的24位数字,该数字照顾R,G和B字节。由于该问题只需要深色,因此我们屏蔽了每个字节的最高有效位。举一个简单的例子,假设RNG吐出了最大值(相当于白色):
0xFFFFFF = 111111111111111111111111
然后我们按位进行“与”运算以去除最高有效位:
0x7F7F7F = 011111110111111101111111
111111111111111111111111&011111110111111101111111 = 011111110111111101111111
答案 1 :(得分:1)
您可以只使用采用单个颜色成分的重载。您需要权衡2个对FromArgb()
的呼叫,以获得3个随机数。
Color c = Color.FromArgb(rand.Next(256), rand.Next(256), rand.Next(256));
答案 2 :(得分:1)
有method,它仅接受一个参数:
Color c = Color.FromArgb(rand.Next(int.MaxValue) | (0xFF0000));
0xFF0000
-创建纯色(alpha = 255)
答案 3 :(得分:1)
我创建了library(麻省理工学院许可)来处理颜色。我还添加了使用随机数生成器的实现。
示例:
获取随机颜色:
RGB rgb = ColorGenerator.GetRandomColor<RGB>();
HEX hex = ColorGenerator.GetRandomColor<HEX>();
CMYK cmyk = ColorGenerator.GetRandomColor<CMYK>();
另一种方法:
GetLightRandomColor<type>();
GetDarkRandomColor<type>();
GetRedRandomColor<type>();
GetGreenRandomColor<type>();
GetBlueRandomColor<type>();