如何在 C# 中生成随机颜色名称

Posted

技术标签:

【中文标题】如何在 C# 中生成随机颜色名称【英文标题】:How to generate random color names in C# 【发布时间】:2011-08-13 22:17:35 【问题描述】:

我需要生成随机颜色名称,例如“红色”、“白色”等。我该怎么做?我能够像这样生成随机颜色:

Random randonGen = new Random();
Color randomColor = Color.FromArgb(randonGen.Next(255), randonGen.Next(255), 
randonGen.Next(255));

但我需要名称,并非所有像这样生成的颜色都有已知名称。

谢谢

【问题讨论】:

并非每种颜色都有名称。他们太多了。你想要一个“最佳猜测”的颜色名称吗?如果是这样的话,你怎么称呼恰好在蓝色和绿色中间的颜色? 【参考方案1】:

如果您想从特定颜色列表中获取随机颜色, 然后试试下面的一个

Color[] colors = new[]  Color.Red, Color.Blue, Color.FromArgb(128, 128, 255) ;    //Add your favorite colors list
Random randonGen = new Random();
Color randomColor = colors[Generator.Next(0, colors.Length)];    //It will choose random color from "colors" array

【讨论】:

【参考方案2】:

为了清除原始问题中的语法错误,它是

Color.FromRgb 和

(字节)random2.Next(255)

将整数转换为颜色所需的字节值:

    Random random2 = new Random();
    public int nn = 0x128;
    public int ff = 0x512;
    Color randomColor = Color.FromRgb((Byte)random2.Next(nn, ff), (Byte)random2.Next(nn, ff), (Byte)random2.Next(nn, ff));

【讨论】:

【参考方案3】:

或者你可以试试这个:对于 .NET 4.5

public Windows.UI.Color GetRandomColor()

            Random randonGen = new Random();
            Windows.UI.Color randomColor = 
                Windows.UI.Color.FromArgb(
                (byte)randonGen.Next(255), 
                (byte)randonGen.Next(255),
                (byte)randonGen.Next(255), 
                (byte)randonGen.Next(255));
            return randomColor;

【讨论】:

-1:问题是获取随机的颜色名称不是颜色 如果您在循环中调用此方法,您将多次获得相同的颜色,因为您每次都会实例化一个新的随机对象。在这种情况下,它将获得相同的种子,从而生成相同的 random 值。【参考方案4】:

我会评论 Pih 的回答;但是,业力不够。 Anywho,我尝试实现这一点并遇到了多次调用生成相同颜色的问题,因为代码被快速连续地重复调用(即 randomGen 是相同的,因为它基于时钟 = 随之而来的结果相同)。

试试这个:

public class cExample

    ...
    Random randomGen = new Random();
    KnownColor[] names = (KnownColor[]) Enum.GetValues(typeof(KnownColor));
    ...
    private Color get_random_color()
    
         KnownColor randomColorName = names[randomGen.Next(names.Length)];
         return Color.FromKnownColor(randomColorName);
    
    ...

【讨论】:

【参考方案5】:

使用Enum.GetValue检索KnownColor枚举的值,得到一个随机值:

Random randomGen = new Random();
KnownColor[] names = (KnownColor[]) Enum.GetValues(typeof(KnownColor));
KnownColor randomColorName = names[randomGen.Next(names.Length)];
Color randomColor = Color.FromKnownColor(randomColorName);

【讨论】:

谢谢你,就像一个魅力! ...我用一个面板来显示颜色【参考方案6】:

在这里,我正在根据已完成的配置文件生成颜色。

public string generateColour(Decimal percentProfileComplete )

    if(percent < 50)
     
        return "#" + (0xff0000 | Convert.ToInt32(Convert.ToDouble(percentProfileComplete ) * 5.1) * 256).ToString("X6");
    
    return "#" + (0xff00 | (255 - Convert.ToInt32((Convert.ToDouble(percentProfileComplete ) - 50) * 5.1)) * 256 * 256).ToString("X6");

【讨论】:

【参考方案7】:
private string getRandColor()
        
            Random rnd = new Random();
            string hexOutput = String.Format("0:X", rnd.Next(0, 0xFFFFFF));
            while (hexOutput.Length < 6)
                hexOutput = "0" + hexOutput;
            return "#" + hexOutput;
        

【讨论】:

有没有想过使用"0:X6而不是通过while循环追加字符串? -1:问题是获取随机的颜色名称不是颜色【参考方案8】:

将颜色放入一个数组中,然后选择一个随机索引:

class RandomColorSelector

    static readonly Color[] Colors = 
        typeof(Color).GetProperties(BindingFlags.Public | BindingFlags.Static)
       .Select(propInfo => propInfo.GetValue(null, null))
       .Cast<Color>()
       .ToArray();

    static readonly string[] ColorNames =  
        typeof(Color).GetProperties(BindingFlags.Public | BindingFlags.Static)
        .Select(propInfo => propInfo.Name)
        .ToArray();

    private Random rand = new Random();

    static void Main(string[] args)
    
        var colorSelector = new RandomColorSelector();
        var color = colorSelector.GetRandomColor();

        // in case you are only after the *name*
        var colorName = colorSelector.GetRandomColorName();            
    

    public Color GetRandomColor()
    
        return Colors[rand.Next(0, Colors.Length)];
    

    public string GetRandomColorName()
    
        return ColorNames[rand.Next(0, Colors.Length)];
    

请注意,上面的示例只是查找 Color 类型的所有静态属性。您可能希望通过检查属性的实际返回类型是否为 Color 来改进这一点。

【讨论】:

请注意,一般来说,对 Random 使用静态变量是个坏主意,因为它不是线程安全的。【参考方案9】:

从Retrieve a list of colors in C#复制代码

代码:

private List<string> GetColors()

    //create a generic list of strings
    List<string> colors = new List<string>();
    //get the color names from the Known color enum
    string[] colorNames = Enum.GetNames(typeof(KnownColor));
    //iterate thru each string in the colorNames array
    foreach (string colorName in colorNames)
    
        //cast the colorName into a KnownColor
        KnownColor knownColor = (KnownColor)Enum.Parse(typeof(KnownColor), colorName);
        //check if the knownColor variable is a System color
        if (knownColor > KnownColor.Transparent)
        
            //add it to our list
            colors.Add(colorName);
        
    
    //return the color list
    return colors;

【讨论】:

+1 表示&gt; KnownColor.Transparent 花絮 - 在检查PS&gt; [enum]::GetValues([System.Drawing.KnownColor]) | % "$($_): $([int]$_)" 的输出后,我还需要添加&amp;&amp; knownColor &lt; KnownColor.ButtonFace【参考方案10】:

生成一个随机数并将其转换为 KnownColor 类型

((KnownColor)Random.Next());

【讨论】:

【参考方案11】:

我会建立一个查找表。特别是因为有些颜色取决于个人的解释。

遍历 Color 结构 (http://msdn.microsoft.com/en-us/library/system.drawing.color.aspx) 中的每个颜色值并将其映射到 RGB 值。然后要转换回来,查找 RGB 值以查看它是否具有命名颜色。

【讨论】:

【参考方案12】:

忽略您追求颜色的事实 - 您实际上只是想要一个可能值的列表,然后从该列表中获取一个随机值。

唯一棘手的一点是确定您要使用哪组颜色。正如 Pih 所提到的,有 KnownColor - 或者您可以在 Color 结构中找出所有类型为 Color 的公共静态属性,并获取它们的名称。这取决于你想做什么。

请注意,随机性本身可能有点尴尬 - 如果您选择多种随机颜色,您可能希望使用 Random` 的单个实例。不幸的是,它不是线程安全的,这可能使事情变得更加复杂。请参阅我的article on randomness 了解更多信息。

【讨论】:

【参考方案13】:

没有办法随机化枚举,就像你想做的那样,最合适的解决方案是通过设置一个包含所有颜色值的列表,然后获得一个随机化它的整数并将其用作索引列表。

【讨论】:

【参考方案14】:

听起来您只需要来自 KnownColor 枚举的随机颜色。

【讨论】:

【参考方案15】:

取一个随机值并从 KnownColor 枚举中获取。

可能是这样:

System.Array colorsArray = Enum.GetValues(typeof(KnownColor));
KnownColor[] allColors = new KnownColor[colorsArray.Length];

Array.Copy(colorsArray, allColors, colorsArray.Length);
// get a randon position from the allColors and print its name.

【讨论】:

复制数组是多余的。 Ideed,它只是从 KnowColor 做一个随机的,对不起 :-)

以上是关于如何在 C# 中生成随机颜色名称的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中生成颜色渐变

在javascript中生成随机颜色的最佳方法? [关闭]

php 在PHP中生成随机颜色

在 Android 的 Recycler View 中生成和设置文本视图背景的随机颜色

在Python中生成颜色范围

如何使用宏在 C++ 中生成随机变量名称?