我知道有一个答案(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;
完成此计算后,y
为998234
,将其转换为十六进制使其成为7f3f07
。我尝试了这两个值,但它们不是深蓝色。
原点颜色是蓝色,我用这种方法得到一个更深的蓝色,但我有一个棕黄色。
我的解决方法有问题吗?
答案 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”,具体取决于您使用的内容。