使六角色看起来更加强烈

时间:2015-07-02 12:46:30

标签: javascript algorithm colors hex

我设法从字符串生成随机的十六进制颜色

function StringToColorFilter() {
    var hashString = function (chaine) {
        var hash = 0, i, chr, len;
        if (chaine.length == 0)
            return hash;
        for (i = 0, len = chaine.length; i < len; i++) {
            chr = chaine.charCodeAt(i);
            hash = ((hash << 5) - hash) + chr;
            hash |= 0; // Convert to 32bit integer
        }
        return hash;
    };
    return function (chaine) {
        return "#" + ("FFFFFF" + Math.abs(hashString(chaine) % 16777216).toString(16)).substr(-6);
    };
}

示例: StringToColorFilter()("MyString") =&gt; #393303 (没有运气这个颜色suxx)

现在:

  • 我想避免白色,淡淡,灰白或苍白的颜色
  • 我想只生成强烈/强烈/丰富多彩的颜色

我首先尝试删除一个组件(红色,绿色或蓝色)或两个组件,但这会消除太多可能性,我仍然可以使用难看的颜色。

然后我尝试删除极值(F / E和0/1)值。但我仍然可以变灰。

一些算法创意?

1 个答案:

答案 0 :(得分:0)

解决方案感谢Tao P. R.Paul S.:使用HSV格式并修复S和V.

在我的情况下,我使用S = 0.59和V = 0.87。所以我只剩下360种颜色但这对我来说已经足够了,这个解决方案确保我的相同的饱和度和亮度超过我的所有颜色

function StringToColorFilter() {
    var hashString = function (chaine) {
        var hash = 0, i, chr, len;
        if (chaine.length == 0)
            return hash;
        for (i = 0, len = chaine.length; i < len; i++) {
            chr = chaine.charCodeAt(i);
            hash = ((hash << 5) - hash) + chr;
            hash |= 0; // Convert to 32bit integer
        }
        return hash;
    };
    function HSVtoRGB(h, s, v) {
        var r, g, b, i, f, p, q, t;
        i = Math.floor(h * 6);
        f = h * 6 - i;
        p = v * (1 - s);
        q = v * (1 - f * s);
        t = v * (1 - (1 - f) * s);
        switch (i % 6) {
            case 0:
                r = v, g = t, b = p;
                break;
            case 1:
                r = q, g = v, b = p;
                break;
            case 2:
                r = p, g = v, b = t;
                break;
            case 3:
                r = p, g = q, b = v;
                break;
            case 4:
                r = t, g = p, b = v;
                break;
            case 5:
                r = v, g = p, b = q;
                break;
        }
        return {
            r: Math.floor(r * 255),
            g: Math.floor(g * 255),
            b: Math.floor(b * 255)
        };
    }
    return function (chaine) {
        var couleur = HSVtoRGB(Math.abs(hashString(chaine) % 360) / 360, 0.59, 0.87);
        return "#" + ("FF" + couleur.r.toString(16)).substr(-2) + ("FF" + couleur.g.toString(16)).substr(-2) + ("FF" + couleur.b.toString(16)).substr(-2);
    };
}
相关问题