gpt4 book ai didi

c# - C#中的随机颜色

转载 作者:行者123 更新时间:2023-12-05 08:26:47 42 4
gpt4 key购买 nike

有什么办法可以简化这行代码吗?两次调用 Color.FromArgb() 真的有必要吗?

Color c = Color.FromArgb(255, Color.FromArgb(Convert.ToInt32(rand.Next(0x1000000))));

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

引用资料:

How do I generate random dark colors in C#?

最佳答案

刚刚在 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)));

原发帖人指出,一对额外的括号消除了 unchecked 的需要:

c = Color.FromArgb((int)(0xFF000000 + (random.Next(0xFFFFFF) & 0x7F7F7F)));

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

0xFFFFFF = 111111111111111111111111

然后我们按位执行 AND 以切掉最高有效位:

0x7F7F7F = 011111110111111101111111

111111111111111111111111 & 011111110111111101111111 = 011111110111111101111111

关于c# - C#中的随机颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50951157/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com