【问题标题】:Random color in C#C#中的随机颜色
【发布时间】:2018-11-29 18:15:09
【问题描述】:

有什么办法可以简化这行代码?真的有必要给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#?

【问题讨论】:

  • 嗯,你可以删除的一件事是Convert.ToInt32,因为rand.Next(我假设System.Random)已经返回了Int32
  • @Corak:你是对的!
  • 这真的应该够简单!!!

标签: c# .net graphics gdi+ gdi


【解决方案1】:

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

【讨论】:

  • 也许Convert.ToInt32() 有助于删除unchecked 语句?
  • 否,这会导致溢出异常。问题是您需要将前 8 位设置为 1,这意味着您最终会以带符号的 int 形式得到一个负数。
  • 它与另外几个括号一起使用:标准Color.FromArgb((int) (0xFF000000 + rand.Next(0xFFFFFF))) 和深色Color.FromArgb((int)(0xFF000000 + (rand.Next(0xFFFFFF) &amp; 0x7F7F7F)))
  • 嗯,你是对的。没想到会起作用......很好。
【解决方案2】:

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

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

【讨论】:

  • 不,抱歉。该引用具有误导性。全彩是我真正追求的。
  • 没问题。我把它换回来了。
【解决方案3】:

method,只接受一个参数:

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

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

【讨论】:

  • 这将创建最多半透明的颜色。我认为 alpha 通道仍然需要为 255。
  • | unchecked((int)0xFF000000) - 否则编译器可能会抱怨。
  • 你的意思是Color.FromArgb(Convert.ToInt32(rand.Next(int.MaxValue) | (0xFF000000)))
【解决方案4】:

我创建了library(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>();

链接: GithubNuGet

【讨论】:

    猜你喜欢
    • 2014-11-17
    • 1970-01-01
    • 2018-03-18
    • 2013-02-03
    • 2015-04-09
    • 2012-11-21
    • 2014-09-08
    • 2012-10-13
    相关资源
    最近更新 更多