根据索引生成独特颜色的算法

时间:2012-08-01 15:05:57

标签: algorithm colors

所有

是否有任何好的算法可以根据数组中的索引生成独特的颜色?

这当然会在UI中使用,以设置许多动态按钮的背景颜色。

现在使用.Net(和我的头脑),支持以下方法:

Color.FromArgb
Color.FromName

FromArgb可以采用包含argb颜色的32位整数。

但是,算法方法可能会导致某些颜色按顺序过于相似,具体取决于数组中的项目数量。而且,前景色与背景类似。

我能想到的唯一方法就是创建一些Color数组,其中包含一组预定义的颜色。当然,这是手动代码工作,但这样你可以在一个小的颜色中得到一组不同的颜色在重复序列之前,可以在视觉上彼此不同的范围。

另一种方法是使用以下方法生成颜色数组:

Enum.GetValues(typeof(KnownColor)

有什么建议吗?

干杯

2 个答案:

答案 0 :(得分:1)

散列索引,并为您的颜色取下散列的低32位。这将是随机的,但应产生均匀的颜色分布。不能保证所选择的颜色在视觉上彼此不同或背景不同,但可以起作用。

你也可以拍摄整个色谱,将它切成n均匀交错的颜色,并将它们分配给数组的每个元素,假设你知道数组的大小。

https://stackoverflow.com/a/43235/684934也可能提出好主意。

答案 1 :(得分:0)

RGB颜色形成彩色空间的3D立方体。首先选择此立方体的角(0或255个值)。然后将立方体细分为8个立方体的网格,并采用新形成的顶点。再次细分为64个立方体,并采用新形成的顶点。对于更高的指数,这将为您提供越来越近的颜色。

IEnumerable<Color> GeneratePalette()
{
    for (int scale = 1; scale < 256; scale *= 2)
    {
        for (int r = 0; r <= scale; r++)
        for (int g = 0; g <= scale; g++)
        for (int b = 0; b <= scale; b++)
        {
            if (scale == 1 || (r & 1) == 1 || (g & 1) == 1 || (b & 1) == 1)
            {
                yield return new Color
                {
                    A = 255,
                    R = (byte) (255 * r / scale),
                    G = (byte) (255 * g / scale),
                    B = (byte) (255 * b / scale),
                };
            }
        }
    }
}

前几种颜色:

#FF000000 
#FF0000FF 
#FF00FF00 
#FF00FFFF 
#FFFF0000 
#FFFF00FF 
#FFFFFF00 
#FFFFFFFF 
#FF00007F 
#FF007F00 
#FF007F7F 
#FF007FFF 
...
#FFFF7FFF 
#FFFFFF7F 
#FF00003F