如何在 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 表示> KnownColor.Transparent
花絮 - 在检查PS> [enum]::GetValues([System.Drawing.KnownColor]) | % "$($_): $([int]$_)"
的输出后,我还需要添加&& knownColor < 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# 中生成随机颜色名称的主要内容,如果未能解决你的问题,请参考以下文章