你有正确的想法,你只需要处理每个 R/G/B 颜色通道。例如,在 vanilla JavaScript 中,您可以执行以下操作:
var a = [255, 0, 0], // First color
b = [0, 0, 255], // Other color
bands = 5, // Bands is the length of your domain
i,
delta = []; // Difference between color in each channel
// Compute difference between each color
for (i = 0; i < 4; i++){
delta[i] = (a[i] - b[i]) / (bands + 1);
}
// Use that difference to create your bands
for (i = 0; i <= bands + 1; i++){
var r = Math.round(a[0] - delta[0] * i);
var g = Math.round(a[1] - delta[1] * i);
var b = Math.round(a[2] - delta[2] * i);
console.log("<div style='background-color: #" + dec2hex(r) + dec2hex(g) + dec2hex(b) + "'>Band " + i + "</div>");
}
// A helper function for formatting
function dec2hex(i) {
return (i+0x100).toString(16).substr(-2).toUpperCase();
}
根据d3 文档r
,您可以使用颜色对象的、g
和b
属性提取每个颜色通道:
# d3.rgb(color)
通过解析指定的颜色字符串构造新的 RGB 颜色。如果 color 不是字符串,则强制转换为字符串;因此,此构造函数还可用于创建现有颜色的副本,或强制将 d3.hsl 颜色转换为 RGB。
...
生成的颜色存储为 [0,255] 范围内的红色、绿色和蓝色整数通道值。通道可用作返回对象的 r、g 和 b 属性。
因此,在上面示例的顶部,您可以说:
var myColor = d3.rgb("blue"),
a = [myColor.r, myColor.g, myColor.b],
...
这有帮助吗?