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

时间:2011-04-27 14:31:43

标签: c# random colors

我需要生成随机颜色名称,例如“红色”,“白色”等我该怎么办?我可以像这样生成随机颜色:

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

但是我需要名字,而不是像这样生成的所有颜色都有一个已知名称。

由于

15 个答案:

答案 0 :(得分:81)

使用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);

答案 1 :(得分:11)

取一个随机值并从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.

答案 2 :(得分:6)

忽略你在颜色之后的事实 - 你真的只想要一个可能的值列表,然后从该列表中取一个随机值。

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

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

答案 3 :(得分:5)

听起来你只需要KnownColor枚举中的随机颜色。

答案 4 :(得分:2)

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

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来改进这一点。

答案 5 :(得分:2)

来自Retrieve a list of colors in C#

的代码

<强> CODE:

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;
}

答案 6 :(得分:2)

或者你可以试试这个:对于.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;
}

答案 7 :(得分:1)

我会构建一个查找表。特别是因为某些颜色是个人解释。

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

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;
        }

答案 10 :(得分:0)

在这里,我根据完成的个人资料生成颜色。

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");
}

答案 11 :(得分:0)

我会对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);
    }
    ...
}

答案 12 :(得分:0)

要清除原始问题中的语法错误,请

Color.FromRgb和

(字节)random2.Next(255)

将整数转换为Color:

所需的字节值
    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));

答案 13 :(得分:0)

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

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

答案 14 :(得分:-1)

生成一个随机数并将其强制转换为KnownColor Type

((KnownColor)Random.Next());