我知道这个答案来得太晚了,但我遇到了类似的问题,这对我有帮助(请注意,下面提供的代码不是我的,这只是多个 StackOverflow 答案的组合)。
一般工作流程:将十六进制代码转换为 RGB,然后转换为 0x 表示。
您可以在此处查看不同的 HEX TO RGB 转换选项:RGB to hex and hex to RGB
我使用了这个函数(很容易反转,因为它返回一个数组 [r, g, b]。也适用于速记十六进制三元组,例如“#03F”)。
hexToRgb(hex) {
return hex.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i
, (m, r, g, b) => "#" + r + r + g + g + b + b)
.substring(1).match(/.{2}/g)
.map(x => parseInt(x, 16));
}
最终转换的想法取自这里:convert rgba color value to 0xFFFFFFFF form in javascript
就像用户@Chanwoo Park 提到的那样,此表示中的颜色 0xFFFFFFFF 形成为 Alpha、Blue、Green、Red 而不是 Alpha、Red、Green、Blue。因此,简单地将颜色 #4286F4 转换为 0xFF4286F4 不会呈现相同的颜色。
您可以做的是反转 RGB 值,然后进行转换。完整代码:
hexToRgb(hex) {
return hex.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i
, (m, r, g, b) => "#" + r + r + g + g + b + b)
.substring(1).match(/.{2}/g)
.map(x => parseInt(x, 16));
},
getFillColor(color) {
let rgbColor = this.hexToRgb(color);
let reversed = rgbColor.reverse();
let hex = 0xff000000 | (reversed[0] << 16) | (reversed[1] << 8) | reversed[2];
return parseInt(`0x${(hex >>> 0).toString(16)}`);
}
附:这是 Vue.js 代码,但转换为 vanilla JS 应该非常简单。
所有功劳归用户所有:https://stackoverflow.com/users/7377162/chanwoo-park、https://stackoverflow.com/users/10317684/ricky-mo、https://stackoverflow.com/users/3853934/micha%c5%82-per%c5%82akowski