我正在寻找一种简单的算法来生成大量随机的、美观的颜色。所以没有疯狂的霓虹灯颜色,让人联想到粪便的颜色等等。

我已经找到了这个问题的解决方案,但它们依赖于替代调色板而不是RGB。 我宁愿直接使用RGB,而不是来回映射。这些其他解决方案也最多只能生成32种左右令人愉悦的随机颜色。

任何想法都很好。


当前回答

使用色彩分明的颜色。

用javascript编写。

它生成了一个视觉上不同颜色的调色板。

Distinct-colors是高度可配置的:

选择调色板中有多少种颜色 将色调限制在一个特定的范围内 限制色度(饱和度)到一个特定的范围 将亮度限制在一个特定的范围内 配置调色板的一般质量

其他回答

转换到另一个调色板是一种更好的方式。他们这样做是有原因的:其他调色板是“感性的”——也就是说,他们把相似的颜色放在一起,调整一个变量会以可预测的方式改变颜色。对于RGB来说,这些都不是真的,在RGB中,颜色之间没有明显的“搭配良好”的关系。

我会使用色轮并在任意位置加上黄金角(137.5度)

http://en.wikipedia.org/wiki/Golden_angle

为了每次都能得到不重叠的不同颜色。

调整颜色轮的亮度,你也可以得到不同的亮/暗颜色组合。

我发现这篇博客文章很好地解释了这个问题和使用黄金比例的解决方案。

http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/

更新:我刚刚发现了另一种方法:

它被称为RYB(红黄蓝)方法,本文对其进行了描述:

http://threekings.tk/mirror/ryb_TR.pdf

作为“油漆灵感的颜色合成”。

算法生成颜色,并选择每个新颜色以最大化其与先前选择的颜色的欧几里得距离。

在这里你可以找到一个很好的javascript实现:

http://afriggeri.github.com/RYB/

更新2:

巴黎政治学院刚刚发布了一个名为“I want Hue”的工具,可以为数据科学家生成调色板。使用不同的颜色空间,并通过使用k-means聚类或力向量(斥力图)生成调色板,这些方法的结果非常好,他们在他们的网页上展示了理论和实现。

http://tools.medialab.sciences-po.fr/iwanthue/index.php

您可以将随机颜色的RGB值与常量颜色的RGB值平均:

(以Java为例)

public Color generateRandomColor(Color mix) {
    Random random = new Random();
    int red = random.nextInt(256);
    int green = random.nextInt(256);
    int blue = random.nextInt(256);

    // mix the color
    if (mix != null) {
        red = (red + mix.getRed()) / 2;
        green = (green + mix.getGreen()) / 2;
        blue = (blue + mix.getBlue()) / 2;
    }

    Color color = new Color(red, green, blue);
    return color;
}

将随机颜色与白色(255,255,255)混合,通过增加明度而保持原始颜色的色调来创建中性的粉彩。这些随机生成的粉彩通常搭配得很好,尤其是大量使用时。

下面是使用上述方法生成的一些柔和的颜色:

你也可以把随机的颜色和固定的粉彩混合在一起,这样就得到了一组中性的颜色。例如,使用浅蓝色可以创建如下颜色:

更进一步,您可以在生成器中添加考虑互补色或阴影级别的启发式,但这一切都取决于您想要使用随机颜色获得的印象。

一些额外的资源:

http://en.wikipedia.org/wiki/Color_theory http://en.wikipedia.org/wiki/Complementary_color

从算法上很难得到你想要的东西——人们研究颜色理论已经很长时间了,他们甚至不知道所有的规则。

然而,有一些规则可以用来剔除糟糕的颜色组合(例如,有冲突的颜色和选择互补的颜色的规则)。

我建议你去图书馆的艺术区看看关于色彩理论的书籍,在你尝试一个好颜色之前更好地理解什么是好颜色——看起来你甚至不知道为什么某些组合有效,而另一些则不行。

亚当

这是我为我做的一个网站写的东西。它会自动为任何带有.flat-color-gen类的div生成随机的平面背景色。Jquery仅用于向页面添加css;它的主要部分是generateFlatColorWithOrder()方法,而不是必需的。

JsFiddle Link

(function($) {
    function generateFlatColorWithOrder(num, rr, rg, rb) {
        var colorBase = 256;
        var red = 0;
        var green = 0;
        var blue = 0;
        num = Math.round(num);
        num = num + 1;
        if (num != null) {

            red = (num*rr) % 256;
            green = (num*rg) % 256;
            blue = (num*rb) % 256;
        }
        var redString = Math.round((red + colorBase) / 2).toString();
        var greenString = Math.round((green + colorBase) / 2).toString();
        var blueString = Math.round((blue + colorBase) / 2).toString();
        return "rgb("+redString+", "+greenString+", "+blueString+")";
        //return '#' + redString + greenString + blueString;
    }

    function generateRandomFlatColor() {
        return generateFlatColorWithOrder(Math.round(Math.random()*127));
    }

    var rr = Math.round(Math.random()*1000);
    var rg = Math.round(Math.random()*1000);
    var rb = Math.round(Math.random()*1000);
    console.log("random red: "+ rr);
    console.log("random green: "+ rg);
    console.log("random blue: "+ rb);
    console.log("----------------------------------------------------");
    $('.flat-color-gen').each(function(i, obj) {
        console.log(generateFlatColorWithOrder(i));
        $(this).css("background-color",generateFlatColorWithOrder(i, rr, rg, rb).toString());
    });
})(window.jQuery);