C# 中的随机颜色



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

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

没有重复的Color.FromArgb()呼叫,我只能得到Alpha=0颜色。

引用:

如何在 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)));

原始海报指出,多了一对支架,无需选中:

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

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

0xFFFFFF = 111111111111111111111111

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

0x7F7F7F = 011111110111111101111111

111111111111111111111111 & 011111110111111101111111 = 011111110111111101111111

您可以只使用采用各个颜色分量的重载。您正在用 2 次调用来换取 3 个随机数,以换取FromArgb()

var rand = new Random();
Color c = Color.FromArgb(rand.Next(256), rand.Next(256), rand.Next(256));

有一个方法,只接受一个参数:

Color c = Color.FromArgb(rand.Next(int.MaxValue) | (0xFF0000));

0xFF0000- 创建纯色 (alpha = 255(

我创建了用于处理颜色的库(MIT许可证(。我还添加了带有随机生成器的实现。

例子:

获取随机颜色:

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>();

链接: Github和NuGet。

相关内容

  • 没有找到相关文章

最新更新