如何将RGB格式的颜色转换为十六进制格式,或将十六进制格式的颜色转换为RGB格式?
例如,将'#0080C0'
转换为 (0, 128, 192)
。
如何将RGB格式的颜色转换为十六进制格式,或将十六进制格式的颜色转换为RGB格式?
例如,将'#0080C0'
转换为 (0, 128, 192)
。
注意: rgbToHex
的两个版本都期望 r
, g
, 和 b
是整数值,因此如果你有非整数值,你需要自己进行四舍五入。
以下代码将执行 RGB 转十六进制并添加所需的零填充:
function componentToHex(c) {
var hex = c.toString(16);
return hex.length == 1 ? "0" + hex : hex;
}
function rgbToHex(r, g, b) {
return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b);
}
alert(rgbToHex(0, 51, 255)); // #0033ff
另一种转换方式:
function hexToRgb(hex) {
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
return result ? {
r: parseInt(result[1], 16),
g: parseInt(result[2], 16),
b: parseInt(result[3], 16)
} : null;
}
alert(hexToRgb("#0033ff").g); // "51";
最后,根据@casablanca的答案中讨论的内容和由@cwolves在评论中提出的建议,提供了rgbToHex()
的另一种版本:
function rgbToHex(r, g, b) {
return "#" + (1 << 24 | r << 16 | g << 8 | b).toString(16).slice(1);
}
alert(rgbToHex(0, 51, 255)); // #0033ff
这是一个可以解析简写十六进制颜色代码(如“#03F”)的hexToRgb()
函数版本:
function hexToRgb(hex) {
// Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF")
var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
hex = hex.replace(shorthandRegex, function(m, r, g, b) {
return r + r + g + g + b + b;
});
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
return result ? {
r: parseInt(result[1], 16),
g: parseInt(result[2], 16),
b: parseInt(result[3], 16)
} : null;
}
alert(hexToRgb("#0033ff").g); // "51";
alert(hexToRgb("#03f").g); // "51";
rgbToHex
函数,以及使用了什么输入值? - Tim DownrgbToHex
函数。您需要将传递的 RGB 值强制转换为整数,或者稍微修改 rgbToHex
函数。示例:
https://jsfiddle.net/cydqo6wj当前版本:
return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
修改后:
return "#" + ((1 << 24) + ((+r) << 16) + ((+g) << 8) + (+b)).toString(16).slice(1);
在修改后的版本中,我只是在转换成 16 进制之前强制将 RGB 值转换为整数。 - user2977468r
,g
和b
对应于捕获组,这就是我们实际想要的内容。 - Tim DownhexToRgb的另一种实现方法:
function hexToRgb(hex) {
var bigint = parseInt(hex, 16);
var r = (bigint >> 16) & 255;
var g = (bigint >> 8) & 255;
var b = bigint & 255;
return r + "," + g + "," + b;
}
编辑:2017年3月28日
这里是另一种方法,似乎甚至更快
function hexToRgbNew(hex) {
var arrBuff = new ArrayBuffer(4);
var vw = new DataView(arrBuff);
vw.setUint32(0,parseInt(hex, 16),false);
var arrByte = new Uint8Array(arrBuff);
return arrByte[1] + "," + arrByte[2] + "," + arrByte[3];
}
编辑:2017年8月11日
经过更多测试,上述新方法并不更快:(。虽然这是一种有趣的替代方式。
return [r, g, b].join();
。 - Pavloreturn [(bigint = parseInt(hex, 16)) >> 16 & 255, bigint >> 8 & 255, bigint & 255].join();
- PlutoparseInt
之前删除非十六进制字符(例如前导的 #
):hex = hex.replace(/[^0-9A-F]/gi, '');
- joewsconst rgbToHex = (r, g, b) => '#' + [r, g, b].map(x => {
const hex = x.toString(16)
return hex.length === 1 ? '0' + hex : hex
}).join('')
console.log(rgbToHex(0, 51, 255)); // '#0033ff'
返回一个数组[r,g,b]
。也适用于缩写的十六进制三元组,如"#03F"
。
const hexToRgb = hex =>
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))
console.log(hexToRgb("#0033ff")) // [0, 51, 255]
console.log(hexToRgb("#03f")) // [0, 51, 255]
padStart()
方法将 RGB 转换为十六进制const rgbToHex = (r, g, b) => '#' + [r, g, b]
.map(x => x.toString(16).padStart(2, '0')).join('')
console.log(rgbToHex(0, 51, 255)); // '#0033ff'
请注意,此答案使用了最新的ECMAScript功能,这些功能不受旧版浏览器支持。如果您希望该代码在所有环境中都能正常工作,应该使用Babel编译代码。
.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i,(m, r, g, b) => '#' + r + r + g + g + b + b)
变成了:.replace(/^#?([a-f\d])([a-f\d])([a-f\d])([a-f\d])$/i,(m, r, g, b, a) => '#' + r + r + g + g + b + b + a + a)
但是有没有办法使正则表达式可以将 RGBA 中的 A 作为可选的第四个十六进制值来工作呢?这将完全完成功能,使一个正则表达式可以处理十六进制 RGB 和 RGBA。否则就需要两个正则表达式,一个带有 3 个值,另一个带有 4 个值。您必须将第四个值除以 255,以获得 rgba() 的第四个参数。 - Sideways S const rgbExcludeFirst = rgb.split('rgb(')[1];
const rgbExcludeLast = rgbExcludeFirst.split(')')[0];
const rgbValueArray = rgbExcludeLast.split(',');
return `#${rgbValueArray.map((x) => {
const valAsInt = parseInt(x, 10);
const hex = valAsInt.toString(16);
return hex.length === 1 ? `0${hex}` : hex;
}).join('')}`;
};``` 如果你想传递一个RGB字符串
- Darren Corbett这是我的版本:
function rgbToHex(red, green, blue) {
const rgb = (red << 16) | (green << 8) | (blue << 0);
return '#' + (0x1000000 + rgb).toString(16).slice(1);
}
function hexToRgb(hex) {
const normal = hex.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i);
if (normal) return normal.slice(1).map(e => parseInt(e, 16));
const shorthand = hex.match(/^#([0-9a-f])([0-9a-f])([0-9a-f])$/i);
if (shorthand) return shorthand.slice(1).map(e => 0x11 * parseInt(e, 16));
return null;
}
rgb2hex
方法有点困惑。为什么我们要将 rgb
加上 0x1000000
,而且为什么最后需要调用 .slice(1)
? - hackjutsufunction hex2rgb(hex) {
return ['0x' + hex[1] + hex[2] | 0, '0x' + hex[3] + hex[4] | 0, '0x' + hex[5] + hex[6] | 0];
}
r
,g
,b
的对象:function hex2rgb(hex){return{r:'0x'+hex[1]+hex[2]|0,g:'0x'+hex[3]+hex[4]|0,b:'0x'+hex[5]+hex[6]|0}}
- ashleedawg我假设你指的是HTML风格的十六进制表示法,即#rrggbb
。你的代码几乎是正确的,只是顺序颠倒了。应该改为:
var decColor = red * 65536 + green * 256 + blue;
此外,使用位移操作可能会使代码更易读:
var decColor = (red << 16) + (green << 8) + blue;
var hexColor = (red < 16 ? '0' : '') + ((red << 16) + (green << 8) + blue).toString(16);
现在开心了吗?:P - user578895一行代码实现十六进制颜色值转换为RGBA颜色值
支持短格式#fff
和长格式#ffffff
。
支持透明度(alpha通道)。
无论是否有井号都可以工作,不做特别要求。
function hexToRGBA(hex, opacity) {
return 'rgba(' + (hex = hex.replace('#', '')).match(new RegExp('(.{' + hex.length/3 + '})', 'g')).map(function(l) { return parseInt(hex.length%2 ? l+l : l, 16) }).concat(isFinite(opacity) ? opacity : 1).join(',') + ')';
}
示例:
hexToRGBA('#fff') -> rgba(255,255,255,1)
hexToRGBA('#ffffff') -> rgba(255,255,255,1)
hexToRGBA('#fff', .2) -> rgba(255,255,255,0.2)
hexToRGBA('#ffffff', .2) -> rgba(255,255,255,0.2)
hexToRGBA('fff', .2) -> rgba(255,255,255,0.2)
hexToRGBA('ffffff', .2) -> rgba(255,255,255,0.2)
hexToRGBA('#ffffff', 0) -> rgba(255,255,255,0)
hexToRGBA('#ffffff', .5) -> rgba(255,255,255,0.5)
hexToRGBA('#ffffff', 1) -> rgba(255,255,255,1)
return 'rgba(' + (hex = hex.replace('#', '')).match(new RegExp('(.{' + hex.length/(hex.length==8?4:3) + '})', 'g')).map(function(l) { return parseInt(hex.length%2 ? l+l : l, 16) }).concat(hex.length===8?'':isFinite(opacity) ? opacity : 1).join(',').replace(/,$/,'') + ')'
- frumbert尝试(奖励)
let hex2rgb= c=> `rgb(${c.match(/\w\w/g).map(x=>+`0x${x}`)})`
let rgb2hex=c=>'#'+c.match(/\d+/g).map(x=>(+x).toString(16).padStart(2,0)).join``
let hex2rgb= c=> `rgb(${c.match(/\w\w/g).map(x=>+`0x${x}`)})`;
let rgb2hex= c=> '#'+c.match(/\d+/g).map(x=>(+x).toString(16).padStart(2,0)).join``;
// TEST
console.log('#0080C0 -->', hex2rgb('#0080C0'));
console.log('rgb(0, 128, 192) -->', rgb2hex('rgb(0, 128, 192)'));
let rgb = color.match(/\w\w/g).map(x=>+\`0x${x}\`);
let lum = (rgb[0]*0.299 + rgb[1]*0.587 + rgb[2]*0.114) / 256;
lum > 0.5 表示颜色为浅色/亮色。 - Aryo这段代码接受 #fff 和 #ffffff 变体以及透明度。
function hex2rgb(hex, opacity) {
var h=hex.replace('#', '');
h = h.match(new RegExp('(.{'+h.length/3+'})', 'g'));
for(var i=0; i<h.length; i++)
h[i] = parseInt(h[i].length==1? h[i]+h[i]:h[i], 16);
if (typeof opacity != 'undefined') h.push(opacity);
return 'rgba('+h.join(',')+')';
}
按位解决方案通常很奇怪。但在这种情况下,我认为它更加优雅。
function hexToRGB(hexColor){
return {
red: (hexColor >> 16) & 0xFF,
green: (hexColor >> 8) & 0xFF,
blue: hexColor & 0xFF,
}
}
使用方法:
const {red, green, blue } = hexToRGB(0xFF00FF)
console.log(red) // 255
console.log(green) // 0
console.log(blue) // 255