将颜色十六进制更改为更暗

时间:2017-11-22 15:55:51

标签: javascript colors hex

我知道有一个答案(Programmatically darken a Hex colour),我已经尝试过这个解释了。

所以,我将变量值保存为十六进制:

let y = chart.color(x);

如果我打印它,它看起来像#1f77b4。所以我删除了第一个字符:

y = y.substr(1);

现在看起来像这样:1f77b4所以我在开头添加0x

y = "0x" + y; =>现在是0x1f77b4。太好了!

现在我尝试使用在该问题上解释的方法使颜色变暗:

y = (y & 0xfefefe) >> 1;

完成此计算后,y998234,将其转换为十六进制使其成为7f3f07。我尝试了这两个值,但它们不是深蓝色。

原点颜色是蓝色,我用这种方法得到一个更深的蓝色,但我有一个棕黄色。

我的解决方法有问题吗?

1 个答案:

答案 0 :(得分:1)

用于转换为十六进制字符串的(未示出的)函数似乎无法正常工作。幸运的是,JavaScript的toString数字函数有一个可选参数,可以为您进行转换。

另外,当你在HTML / JavaScript中使用结果时,你可能需要在宽度为6的前面加零,所以......

function halveBrightness(hexColor) {
    if (hexColor.charAt(0) == "#") {
        hexColor = hexColor.substr(1);
    }
    var color = parseInt(hexColor, 16);
    /* using the method of https://stackoverflow.com/a/1787193/1115360 */
    color = (color & 0xFEFEFE) >> 1;

    return padLeft("0", 6, color.toString(16));

}

function padLeft(padChar, finalLength, str) {
    padChar = padChar.charAt(0);
    var nPads = finalLength - str.length;
    var padding = "";
    for(var i=1; i<=nPads; i++) {
        padding += padChar;
    }

    return padding + str;
}

/* using the value from the question */
var y = "#1f77b4";
console.log(halveBrightness(y));

/* check it works when bytes are/will become zero */
console.log(halveBrightness("0001FF"));

输出:

  

0f3b5a
  00007f

您可能需要在结果的开头加上“#”或“0x”,具体取决于您使用的内容。