C#中的随机颜色
Random color in C#
有什么办法可以简化这行代码吗?两次调用 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#?
您可以只使用采用单独颜色分量的重载。您正在对 FromArgb()
的 2 次调用换取 3 个随机数。
var rand = new Random();
Color c = Color.FromArgb(rand.Next(256), rand.Next(256), rand.Next(256));
有 method,它只接受一个参数:
Color c = Color.FromArgb(rand.Next(int.MaxValue) | (0xFF0000));
0xFF0000
- 创建纯色 (alpha = 255)
刚刚在 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 位整数来表示四个字节 A、R、G 和 B。我们希望颜色是纯色,因此 A 需要为 255,因此:
0xFF000000
然后 random.Next(0xFFFFFF) 生成一个伪随机 24 位数字来处理 R、G 和 B 字节。由于问题只需要深色,因此我们屏蔽掉了每个字节的最高有效位。举个简单的例子,假设 RNG 吐出了最大值(相当于白色):
0xFFFFFF = 111111111111111111111111
然后我们进行按位 AND 运算以截断最高有效位:
0x7F7F7F = 011111110111111101111111
111111111111111111111111 & 011111110111111101111111 = 011111110111111111111111
我创建了 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>();
有什么办法可以简化这行代码吗?两次调用 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#?
您可以只使用采用单独颜色分量的重载。您正在对 FromArgb()
的 2 次调用换取 3 个随机数。
var rand = new Random();
Color c = Color.FromArgb(rand.Next(256), rand.Next(256), rand.Next(256));
有 method,它只接受一个参数:
Color c = Color.FromArgb(rand.Next(int.MaxValue) | (0xFF0000));
0xFF0000
- 创建纯色 (alpha = 255)
刚刚在 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 位整数来表示四个字节 A、R、G 和 B。我们希望颜色是纯色,因此 A 需要为 255,因此: 0xFF000000 然后 random.Next(0xFFFFFF) 生成一个伪随机 24 位数字来处理 R、G 和 B 字节。由于问题只需要深色,因此我们屏蔽掉了每个字节的最高有效位。举个简单的例子,假设 RNG 吐出了最大值(相当于白色):
0xFFFFFF = 111111111111111111111111
然后我们进行按位 AND 运算以截断最高有效位:
0x7F7F7F = 011111110111111101111111
111111111111111111111111 & 011111110111111101111111 = 011111110111111111111111
我创建了 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>();