首页 文章

生成独特颜色的算法

提问于
浏览
25

我正在寻找一种能够生成一系列颜色的算法,以便颜色尽可能广泛地分布(因此它们不会轻易混淆) .

我有一系列具有从1开始计数的ID的对象 . 我想用不同的,美学上令人愉悦的颜色来表示每个对象,这些颜色不容易与其邻居混淆 . 颜色不一定是随机的 . 我想每次输入相同的ID时都会得到相同的颜色 .

5 回答

  • 10

    可能元素的数量是否具有合理的下限?一种快速简便的解决方案是使用项目的ID存储一系列颜色值 . 这假设您的颜色数量相对较少,并且您确定不会超过一定数量的项目 .

    如果你想生成颜色而不是使用列表,那么使它们具有一致和正常外观的一个技巧就是使用HSB生成它们 . 预先定义亮度和饱和度,然后将色调值基于ID的某个函数(这可能是各种各样的事情,具体取决于您计划拥有多少ID,但将ID乘以某个量(并且当它超过时进行修改) 255!)是一个很好的粗略方法 . 使用这种方法,颜色将在饱和度和亮度方面全部“对齐”,但它们每个都具有不同的颜色 .

    我在工作上有点无聊,所以我掀起了一个快速的解决方案:

    class HsbColor
    {
        public int Hue { get; set; }
        public int Saturation { get; set; }
        public int Brightness { get; set; }
    
        public Color ToRGB
        {
            // left as exercise to the reader...
        }
    }
    
    public class Item
    {
    
    
        public int Id { get; set; }
        private static const byte EXPECTED_MAX = 15;
        private static int HUE_FACTOR = 255 / EXPECTED_MAX;
    
        public HsbColor Color 
        {
           get {
    
             var color = new HsbColor() { Saturation = 175, Brightness = 175 };
    
             color.Hue = (Id * HUE_FACTOR) % 255;
    
             return color;
           }
        }
    }
    
  • 17

    我已经检查了所有这些方法,解决了很多方法 . 最后用CIEde2000蛮力,真的,你最好的选择只是一个静态列表 . 无论你做什么,你都不能获得超过30种颜色,并且具有良好的清晰度 . 色盲的因素和混乱的线条,你真的在做一些阻碍 . 使用查找表并使用除颜色之外的其他一些特征修改数据点 .

    max difference color palette

    #000000
    #00FF00
    #0000FF
    #FF0000
    #01FFFE
    #FFA6FE
    #FFDB66
    #006401
    #010067
    #95003A
    #007DB5
    #FF00F6
    #FFEEE8
    #774D00
    #90FB92
    #0076FF
    #D5FF00
    #FF937E
    #6A826C
    #FF029D
    #FE8900
    #7A4782
    #7E2DD2
    #85A900
    #FF0056
    #A42400
    #00AE7E
    #683D3B
    #BDC6FF
    #263400
    #BDD393
    #00B917
    #9E008E
    #001544
    #C28C9F
    #FF74A3
    #01D0FF
    #004754
    #E56FFE
    #788231
    #0E4CA1
    #91D0CB
    #BE9970
    #968AE8
    #BB8800
    #43002C
    #DEFF74
    #00FFC6
    #FFE502
    #620E00
    #008F9C
    #98FF52
    #7544B1
    #B500FF
    #00FF78
    #FF6E41
    #005F39
    #6B6882
    #5FAD4E
    #A75740
    #A5FFD2
    #FFB167
    #009BFF
    #E85EBE
    
  • 10

    您可以将id乘以golden ratio(phi)以获得数字0 <= n <1 . 您生成的所有数字将趋于均匀分布 .

    PHI = (1 + sqrt(5))/2
    n = id * PHI - floor(id * PHI)
    

    然后是将该数字转换为颜色的问题,例如

    hue = floor(n * 256)
    
  • 22

    图形设计人员知道,如果在信息显示中要将许多颜色彼此靠近使用,则颜色空间中的颜色应该相对接近 . 饱和度或色调的微小变化通常比大跳跃更好 - 当涉及许多颜色时,人眼实际上发现当颜色距离不是很大时更容易吸收信息 .

    此外,不要忘记您的一些用户将是色盲 . 由于色盲的种类繁多,很难知道要避免哪种组合 . 也许其他人可以解决这个问题?

  • 7

    我写了一篇关于同一主题的文章:

    How to Generate Random Colors Programmatically

    基本上你可以使用HSV颜色空间,设置固定的饱和度和值,并修改Hue . 当您知道所需的颜色数量时,只需将Hue的范围分开 [0,1[ 即可 . 如果您不知道所需颜色的数量,您仍然可以使用黄金比例从该空间中选择颜色 .

相关问题