RGB 到十六进制和十六进制到 RGB

IT技术 javascript colors hex rgb
2021-01-17 01:00:48

如何将 RGB 格式的颜色转换为十六进制格式,反之亦然?

例如,转换'#0080C0'(0, 128, 192).

6个回答

注意,和 的两个版本都rgbToHex期望整数值,因此如果您有非整数值,则需要自己进行舍入。rgb

以下将执行 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";

最后,还有一个替代版本rgbToHex(),如@casablanca的回答中所讨论和@cwolves 的评论中所建议的:

function rgbToHex(r, g, b) {
  return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
}

alert(rgbToHex(0, 51, 255)); // #0033ff

2012 年 12 月 3 日更新

这是一个hexToRgb()也解析速记十六进制三元组的版本,例如“#03F”:

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";

位移位(例如(r << 16))会在大端和小端计算机上给出相同的结果吗?编辑:它没有。原因如下:stackoverflow.com/questions/1041554/...
2021-03-13 01:00:48
您的 rgbToHex 不起作用。得到有趣的结果:#f55b2f00
2021-03-15 01:00:48
关于最新rgbToHex功能。人们可能希望将传递的 rgb 值转换为整数,或者稍微修改 rgbToHex 函数。示例: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); 在修改后的版本中,我只是强制 rgb 值在更改为 16/hex 之前以整数进行评估。
2021-03-16 01:00:48
@RobinMétral:这是正则表达式匹配的完整字符串。rgb对应于捕获组,这是我们真正想要的东西。
2021-03-24 01:00:48
@Vitim.us:<<是按位左移运算符。假设g是一个非零整数,g << 8因此有效地乘以g256,在其十六进制表示的末尾加上零。同样r << 16添加 4 个零。添加1 << 24(十六进制为 1000000)可确保在1使用slice(). 例如,如果rg都为零且b为 51,((r << 16) + (g << 8) + b).toString(16)则将返回字符串“33”;添加1 << 24,你会得到“1000033”。然后剥离1,你就在那里。
2021-04-09 01:00:48

hexToRgb 的替代版本:

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;
}

编辑:3/28/2017 这是另一种方法 这似乎更快

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];
}

编辑:8/11/2017 经过更多测试后,上面的新方法并不快:(。虽然这是一种有趣的替代方法。

小心这一点,它的输出不可靠。它使接近黑色的颜色显得深粉色。最好使用顶级答案中的功能。
2021-03-10 01:00:48
不要急于使用速记版本。JSPerf 显示这个答案中的那个是最快的:jsperf.com/2014-09-16-hex-to-rgb
2021-03-17 01:00:48
一条完美的线:return [r, g, b].join();
2021-03-22 01:00:48
我通过一个调整来使用它 - 在之前删除非十六进制字符(如前导#parseInthex = hex.replace(/[^0-9A-F]/gi, '');
2021-03-30 01:00:48
或者对于全封装的单线解决方案: return [(bigint = parseInt(hex, 16)) >> 16 & 255, bigint >> 8 & 255, bigint & 255].join();
2021-04-01 01:00:48

Tim Down 的回答的ECMAScript 6 版本

将 RGB 转换为十六进制

const 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'

将十六进制转换为 RGB

返回一个数组[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]

奖励:RGB 到十六进制使用padStart()方法

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来编译你的代码。

hexToRgb() 很容易适应处理 4 位和 8 位十六进制 RGBA 符号:.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 作为可选的第 4 个十六进制值一起工作?这将绝对完成功能,使一个正则表达式与十六进制 RGB 和 RGBA 一起使用。否则它是两个正则表达式,一个有 3 个值,另一个有 4 个。您必须将第 4 个值除以 255 才能获得 rgba() 的第 4 个 arg。
2021-03-26 01:00:48
const rgbToHex = (rgb) => { 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 字符串
2021-04-03 01:00:48

这是我的版本:

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;
}

使用ES6/ES2015箭头函数语法:

const rgbToHex = (red, green, blue) => {
    const rgb = (red << 16) | (green << 8) | (blue << 0);
    return '#' + (0x1000000 + rgb).toString(16).slice(1);
}
    
const 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;
}
这也对我有用,当此页面上的其他示例没有时。我想将 RGB 100、100、100 转换为十六进制,此页面上的其他示例返回“#100100100”-而此示例正确返回“#646464”
2021-03-24 01:00:48
因为蓝色是#FF,我们添加0x1000000,所以它是#10000FF,然后我们删除第一个“1”。
2021-03-31 01:00:48
rgb2hex方法有点困惑我们为什么要添加0x1000000rgb,为什么我们需要.slice(1)最后调用
2021-04-03 01:00:48
function hex2rgb(hex) {
  return ['0x' + hex[1] + hex[2] | 0, '0x' + hex[3] + hex[4] | 0, '0x' + hex[5] + hex[6] | 0];
}
我喜欢简单的答案
2021-03-23 01:00:48
好的!这是同样的事情,除了缩小并返回一个具有属性的对象rg, bfunction hex2rgb(hex){return{r:'0x'+hex[1]+hex[2]|0,g:'0x'+hex[3]+hex[4]|0,b:'0x'+hex[5]+hex[6]|0}}
2021-04-02 01:00:48
非常好。不适用于速记但整洁。处理没有丑陋下标的哈希。
2021-04-02 01:00:48
巫术!你应该为这个非常酷的单行添加一个解释。
2021-04-08 01:00:48