C#中的随机颜色

abe*_*nci 2 .net c# graphics gdi+ gdi

有没有办法简化这行代码?两个电话Color.FromArgb()真的有必要吗?

Color c = Color.FromArgb(255, Color.FromArgb(Convert.ToInt32(rand.Next(0x1000000))));
Run Code Online (Sandbox Code Playgroud)

如果没有重复的Color.FromArgb()调用,我只会得到Alpha=0颜色。

参考:

如何在 C# 中生成随机深色?

Ste*_*evo 5

刚刚在 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}");
Run Code Online (Sandbox Code Playgroud)

更简洁地说,它将是:

var random = new Random();
Color c;
unchecked
{
    c = Color.FromArgb((int)0xFF000000 + (random.Next(0xFFFFFF) & 0x7F7F7F));
}
Run Code Online (Sandbox Code Playgroud)

或者,如果你想通过位操作变得非常时髦(这不是更有效,只是节省了你输入一些 0):

c = Color.FromArgb((int)(0xFF << 24 ^ (random.Next(0xFFFFFF) & 0x7F7F7F)));
Run Code Online (Sandbox Code Playgroud)

原始海报指出,额外的一对括号消除了未经检查的需要:

c = Color.FromArgb((int)(0xFF000000 + (random.Next(0xFFFFFF) & 0x7F7F7F)));
Run Code Online (Sandbox Code Playgroud)

一点解释。ARGB 使用有符号的 32 位 int 来表示四个字节,A、R、G 和 B。我们希望颜色为纯色,因此 A 需要为 255,因此: 0xFF000000 然后 random.Next(0xFFFFFF) 生成一个伪-处理 R、G 和 B 字节的随机 24 位数字。由于问题只需要深色,我们屏蔽了每个字节的最高有效位。举个简单的例子,假设 RNG 吐出最大值(相当于白色):

0xFFFFFF = 1111111111111111111111111

然后我们做一个按位 AND 来砍掉最重要的位:

0x7F7F7F = 0111111101111111101111111

111111111111111111111111 & 011111110111111101111111 = 011111110111111101111111