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

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

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

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

谢谢

【问题讨论】:

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

标签: c# random colors


【解决方案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 做一个随机的,对不起 :-)
                    猜你喜欢
                    • 2013-01-21
                    • 2023-01-05
                    • 1970-01-01
                    • 2010-12-07
                    • 2013-01-19
                    • 2012-06-13
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-09-17
                    相关资源
                    最近更新 更多