Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使六色看起来更浓烈_Javascript_Algorithm_Colors_Hex - Fatal编程技术网

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不走运)

所以现在:

  • 我想避免白色、平淡、灰色或浅色
  • 我只想生成浓烈/浓烈/多彩的颜色
我第一次尝试删除一个组件(红色、绿色或蓝色)或两个组件,但这删除了太多的可能性,我仍然可以使用难看的颜色

然后我尝试去除极值(F/E和0/1),但我仍然可以使用灰色


一些算法思想?

解决方案得益于:使用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。因此,如果你确保它们不相同,甚至更好,显著不同,你将避免所有灰度。