我设法从字符串生成随机的十六进制颜色:
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)值。但我仍然可以变灰。
一些算法创意?
答案 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);
};
}