Javascript 使六色看起来更浓烈
我设法从字符串中生成一个随机的十六进制颜色:Javascript 使六色看起来更浓烈,javascript,algorithm,colors,hex,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++) {
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(){
var hashString=函数(链){
var hash=0,i,chr,len;
if(chaine.length==0)
返回散列;
对于(i=0,len=chaine.length;i#393303
(此颜色suxx不走运)
所以现在:
- 我想避免白色、平淡、灰色或浅色
- 我只想生成浓烈/浓烈/多彩的颜色
一些算法思想?解决方案得益于:使用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);
};
}
函数StringToColorFilter(){
var hashString=函数(链){
var hash=0,i,chr,len;
if(chaine.length==0)
返回散列;
对于(i=0,len=chaine.length;i 散列=((对于颜色的强度散列,您可能需要将其转换为分别表示色度、强度和饱和度分量的HSV
或HSL
颜色空间。因此,您可以更轻松地操纵颜色的饱和度和强度。仅供参考,从RGB
到HSV
来回转换可能需要成本。)在某种程度上有些损失。你可能也需要意识到这一点。@TaoP.R.如果你在完成之前不舍入,这应该是最小的()@PaulS.这是非常有用的建议。Antoine,你可能想研究一下这种方法。为了避免任何灰度,你需要强制rgb值之间的变化。白色和黑色之间的任何灰色表示r=g=b。因此,如果你确保它们不相同,甚至更好,显著不同,你将避免所有灰度。