1

全部,

有没有什么好的算法可以根据数组中的索引生成唯一的颜色?

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

现在有了 .Net(以及 Java),支持以下方法:

Color.FromArgb
Color.FromName

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

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

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

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

Enum.GetValues(typeof(KnownColor)

有什么建议么?

干杯

4

2 回答 2

1

散列索引,并将散列的低 32 位作为您的颜色。这看起来是随机的,但应该会产生均匀的颜色分布。不保证所选颜色在视觉上会与彼此或背景不同,但可以提供。

您还可以获取整个色谱,将其切成n均匀间隔的颜色,并将它们分配给数组的每个元素,假设您知道数组的大小。

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

于 2012-08-01T15:10:13.583 回答
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 
于 2012-08-01T17:46:27.360 回答