我正在生成一些需要颜色的十六进制字符串的图表。
示例:
<dataseries name="ford" color="FF00FF" />
我正在动态创建它们,所以我想随机为每个数据生成十六进制代码。
这样做的最佳方式是什么?
答案 0 :(得分:114)
最简单的方法是使用String.Format
并使用十六进制格式作为参数。
var random = new Random();
var color = String.Format("#{0:X6}", random.Next(0x1000000)); // = "#A197B9"
答案 1 :(得分:16)
IMO,纯色随机颜色可能不是优选的,因为您需要人眼可区分的颜色。
如何预设多种颜色并随意挑选?
也许你可以在一些开源图表库中找到更好的答案。
答案 2 :(得分:15)
Samuel的答案是最好的方法,只要确保如果你在循环中生成颜色,那么每次都不会实例化一个新的Random
对象,因为new Random()
种子使用系统时钟的发生器。你的循环运行速度会超过时钟可以打勾的速度,所以你最终会反复生成几种相同的颜色,因为random
被播种的值相同。
看起来应该是这样的:
int numColors = 10;
var colors = new List<string>();
var random = new Random(); // Make sure this is out of the loop!
for (int i = 0; i < numColors; i++)
{
colors.Add(String.Format("#{0:X6}", random.Next(0x1000000)));
}
而不是:
int numColors = 10;
var colors = new List<string>();
for (int i = 0; i < numColors; i++)
{
var random = new Random(); // Don't put this here!
colors.Add(String.Format("#{0:X6}", random.Next(0x1000000)));
}
答案 3 :(得分:12)
生成一组漂亮的颜色的好方法是使用固定饱和度和亮度定义它们并改变色调。
这为你提供了一套很好的颜色,看起来都像来自同一个'套装' - 所有的粉彩,或者所有的强烈,或者所有的灰白色,无论如何。如果您有Color.FromHSV(),那么编码非常简单。
一旦你获得了太多的颜色,它可能会停止工作,它们将无法区分。但无论如何,你可能会遇到这个问题。
在伪代码中:
Sat = 0.5 * 255 //assuming we want range 0-255...
Brightness = 0.9 * 255
NumberOfColours = 7
HueSeparation = 360 / 7
Colors = []
for (i = 0 ; i< NumberOfColours; i++)
Colors.Add(Color.FromHSV(HueSeparation * i, Sat, Brightness)
或
n = 7
Colors = [Color.FromHSV(x*360/n, 128, 230) for x in range(n)]
(我喜欢列表推导......)
答案 4 :(得分:4)
Random rand = new Random(); // specify a seed
int r = rand.Next(0x1000000);
Console.WriteLine("#{0:X6}", r);
答案 5 :(得分:3)
我注意到你(Rahkim)评论了格雷格的帖子,你希望你能把他的想法(保持饱和度和价值不变,只是改变色调......一个好主意)转化为代码。您可以!或者说,有人已经为你准备好了!
我在Converting HSV to RGB colour using C#上发现了这篇博文,我相信还有更多内容。你可能最终会得到一套更好的颜色,而不是完全随意地挑选它们。
此外,当然,这种方法可以很容易地获得一组漂亮的颜色...因为Hue从0-359开始,你可以做一些像你这样设置你的Hue:
Hue = (PreviousHue + 50) % 360;
(我选择了50,因为它没有均匀地进入360,所以如果你超过360,你将不会立即开始重复色调。你必须玩弄价值以获得理想的分离取决于如何你期待的许多不同的颜色。)
通过这种方式,您可以不必担心当仍有大量未使用的“色调”空间时,代码会随机选择两种颜色彼此超级接近的情况。