RGB в Hex и Hex в RGB

556

Как преобразовать цвета в формате RGB в шестнадцатеричный формат и наоборот?

Например, конвертировать '#0080C0'в (0, 128, 192).

Синдар
источник

Ответы:

1237

Примечание : обе версии 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";

Наконец, альтернативная версия 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

Обновление 3 декабря 2012

Вот версия, 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";

Тим Даун
источник
10
@ Vitim.us: <<оператор сдвига влево. Предполагается, gчто это ненулевое целое число, g << 8поэтому эффективно умножается gна 256, добавляя нули к концу его шестнадцатеричного представления. Аналогично r << 16добавляет 4 ноля. Добавление 1 << 24(1000000 в шестнадцатеричном формате) гарантирует, что шестнадцатеричное представление будет дополнено левыми полями любыми необходимыми нулями после 1удаления начального значения с помощью slice(). Например, если бы rи gбыли и ноль, и bбыло 51, ((r << 16) + (g << 8) + b).toString(16)вернул бы строку «33»; добавь 1 << 24и получишь "1000033". Тогда раздень 1и ты там.
Тим Даун
Будет ли сдвиг битов (например (r << 16)) давать одинаковые результаты как на больших, так и на младших порядковых компьютерах? Редактировать: это не так. Вот почему: stackoverflow.com/questions/1041554/…
WoodenKitty
@ Gothdo: Извините, что откатил ваши изменения, но часто ES6 не представляется возможным или нецелесообразным. Предыдущая версия будет работать где угодно.
Тим Даун
3
ваш rgbToHex не работает. получаю забавный результат: # f55b2f00
TheCrazyProfоресурс
1
По поводу последней rgbToHexфункции. Кто-то захочет либо типизировать переданные вами значения rgb в виде целых чисел, либо немного изменить функцию rgbToHex. Пример: jsfiddle.net/cydqo6wj Current: return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1); Modified: return "#" + ((1 << 24) + ((+r) << 16) + ((+g) << 8) + (+b)).toString(16).slice(1); В модифицированной версии я просто заставляю значения rgb вычисляться в целых числах до перехода на 16 / hex.
user2977468
148

Альтернативная версия 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;
}

Редактировать: 28.03.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 Новый подход выше после дополнительного тестирования не быстрее :(. Хотя это забавный альтернативный способ.

Дэвид
источник
57
Линия совершенства return [r, g, b].join();.
Павло
5
Или для полностью герметичного однострочного решения:return [(bigint = parseInt(hex, 16)) >> 16 & 255, bigint >> 8 & 255, bigint & 255].join();
Плутон
12
Я использую это с одним твиком - удалите не шестнадцатеричные символы (как ведущий #) до parseInt:hex = hex.replace(/[^0-9A-F]/gi, '');
joews
5
Не спешите использовать сокращенную версию. JSPerf показывает, что ответ в этом ответе самый быстрый: jsperf.com/2014-09-16-hex-to-rgb
Олав Коковкин
1
Будьте осторожны с этим, его вывод не надежен. Это сделало цвет, близкий к черному, казался темно-розовым. Лучше использовать функцию сверху ответа.
Мацей Кравчик
64

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)Но есть ли способ заставить регулярное выражение работать с A RGBA в качестве необязательного 4-го шестнадцатеричного значения? Это полностью дополнило бы функциональность, заставив одно регулярное выражение работать с шестнадцатеричным RGB и RGBA. В противном случае это два регулярных выражения, одно с 3 значениями, другое с 4. Вы должны разделить 4-е значение на 255, чтобы получить 4-й аргумент для rgba ().
Джеймс
44

Вот моя версия:

  function rgb2hex(red, green, blue) {
        var rgb = blue | (green << 8) | (red << 16);
        return '#' + (0x1000000 + rgb).toString(16).slice(1)
  }

  function hex2rgb(hex) {
        // long version
        r = hex.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i);
        if (r) {
                return r.slice(1,4).map(function(x) { return parseInt(x, 16); });
        }
        // short version
        r = hex.match(/^#([0-9a-f])([0-9a-f])([0-9a-f])$/i);
        if (r) {
                return r.slice(1,4).map(function(x) { return 0x11 * parseInt(x, 16); });
        }
        return null;
  }
FelipeC
источник
круто, но вопрос был hex2rgb. Можете ли вы сделать это так коротко, как это, что было бы хорошо :)
К. Килиан Линдберг
4
Хотя это не идет обоими путями, я должен поддержать это, потому что другие решения rgb to hex в этом вопросе не работали для меня.
Гусь
Вопрос был сначала от rgb2hex. В любом случае я добавил свой собственный hex2rgb.
FelipeC
Немного запутался по поводу rgb2hexметода. Почему мы добавим 0x1000000к rgb, и почему мы должны вызвать .slice(1)в последний раз ?
хакдзюцу
Поскольку синий будет #FF, мы добавим 0x1000000, то есть # 10000FF, а затем удалим первое «1».
FelipeC
26

Я предполагаю , что вы имеете в виду HTML-стиль шестнадцатеричного т.е. #rrggbb. Ваш код почти правильный, за исключением того, что вы изменили заказ. Должен быть:

var decColor = red * 65536 + green * 256 + blue;

Кроме того, использование битовых сдвигов может немного облегчить чтение:

var decColor = (red << 16) + (green << 8) + blue;
Касабланка
источник
Отлично, за исключением того, что вам нужно оставить нулевое отступ до 6 символов, если красный <16:var decColor = (red < 16 ? '0' : '') + (red << 16) + (green << 8) + blue;
Марк Кан
Кажется, работает за исключением этого: (0,128,192), вероятно, из-за 0?
Синдар
@cwolves: Ты прав, я это пропустил. Но он должен быть добавлен к последней строке, а не к целому числу.
Касабланка
@Sindar: Смотрите комментарий @cwolves, если red < 16вам нужно добавить префикс a 0к конечному результату.
Касабланка
20
хорошо, ЗДЕСЬ:var hexColor = ((1 << 24) + (red << 16) + (green << 8) + blue).toString(16).substr(1);
Марк Кан
22
function hex2rgb(hex) {
  return ['0x' + hex[1] + hex[2] | 0, '0x' + hex[3] + hex[4] | 0, '0x' + hex[5] + hex[6] | 0];
}
Резонер
источник
2
Я люблю простые ответы
Бьорн Берендт
Колдовство! Вы должны добавить объяснение к этой очень крутой однострочнике.
Джеймс Харрингтон
Ницца! Вот то же самое, за исключением того, уменьшенная и возвращение объекта со свойствами 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
21

Этот код принимает варианты #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(',')+')';
}
Фалько
источник
11

Однострочный функционал от HEX до RGBA

Поддерживает как короткие, так #fffи длинные #ffffffформы.
Поддерживает альфа-канал (непрозрачность).
Не заботится, указан хэш или нет, работает в обоих случаях.

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(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)  
Денис
источник
9
Попробуйте написать читабельный, а не однострочный код. В любом случае, если вы минимизируете свой код перед производством, вы не получите никакой выгоды.
Roko C. Buljan
11

Это может быть использовано для получения цветов из вычисленных свойств стиля:

function rgbToHex(color) {
    color = ""+ color;
    if (!color || color.indexOf("rgb") < 0) {
        return;
    }

    if (color.charAt(0) == "#") {
        return color;
    }

    var nums = /(.*?)rgb\((\d+),\s*(\d+),\s*(\d+)\)/i.exec(color),
        r = parseInt(nums[2], 10).toString(16),
        g = parseInt(nums[3], 10).toString(16),
        b = parseInt(nums[4], 10).toString(16);

    return "#"+ (
        (r.length == 1 ? "0"+ r : r) +
        (g.length == 1 ? "0"+ g : g) +
        (b.length == 1 ? "0"+ b : b)
    );
}

// not computed 
<div style="color: #4d93bc; border: 1px solid red;">...</div> 
// computed 
<div style="color: rgb(77, 147, 188); border: 1px solid rgb(255, 0, 0);">...</div>

console.log( rgbToHex(color) ) // #4d93bc
console.log( rgbToHex(borderTopColor) ) // #ff0000

Ссылка: https://github.com/k-gun/so/blob/master/so_util.js

K-Gun
источник
Спасибо тебе за это. Но есть небольшая ошибка: должен вернуться (r.length == 1 ? "0" + r : r)и аналогично для зеленого и синего.
тифон
7

Побитовое решение обычно странно. Но в этом случае я думаю, что это более элегантно 😄

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
Араль Рока
источник
6

// Игнорируя запись hsl, значения цвета обычно выражаются в виде имен, rgb, rgba или hex-

// Hex может быть 3 значения или 6.

// Rgb может быть процентами, а также целочисленными значениями.

// Лучше всего учитывать все эти форматы, по крайней мере.

String.prototype.padZero= function(len, c){
    var s= this, c= c || "0", len= len || 2;
    while(s.length < len) s= c + s;
    return s;
}
var colors={
    colornames:{
        aqua: '#00ffff', black: '#000000', blue: '#0000ff', fuchsia: '#ff00ff',
        gray: '#808080', green: '#008000', lime: '#00ff00', maroon: '#800000',
        navy: '#000080', olive: '#808000', purple: '#800080', red: '#ff0000',
        silver: '#c0c0c0', teal: '#008080', white: '#ffffff', yellow: '#ffff00'
    },
    toRgb: function(c){
        c= '0x'+colors.toHex(c).substring(1);
        c= [(c>> 16)&255, (c>> 8)&255, c&255];
        return 'rgb('+c.join(',')+')';
    },
    toHex: function(c){
        var tem, i= 0, c= c? c.toString().toLowerCase(): '';
        if(/^#[a-f0-9]{3,6}$/.test(c)){
            if(c.length< 7){
                var A= c.split('');
                c= A[0]+A[1]+A[1]+A[2]+A[2]+A[3]+A[3];
            }
            return c;
        }
        if(/^[a-z]+$/.test(c)){
            return colors.colornames[c] || '';
        }
        c= c.match(/\d+(\.\d+)?%?/g) || [];
        if(c.length<3) return '';
        c= c.slice(0, 3);
        while(i< 3){
            tem= c[i];
            if(tem.indexOf('%')!= -1){
                tem= Math.round(parseFloat(tem)*2.55);
            }
            else tem= parseInt(tem);
            if(tem< 0 || tem> 255) c.length= 0;
            else c[i++]= tem.toString(16).padZero(2);
        }
        if(c.length== 3) return '#'+c.join('').toLowerCase();
        return '';
    }
}
//var c='#dc149c';
//var c='rgb(100%,25%,0)';
//
var c= 'red';
alert(colors.toRgb(c)+'\n'+colors.toHex(c));
Kennebec
источник
За это проголосовала самая полная версия, на которую я смотрел. Было бы здорово, если бы он мог также извлечь цвета из rgba.
Майкл Шепер
6

@ Тим, чтобы добавить к своему ответу (это немного неудобно вписывать это в комментарий).

Как написано, я обнаружил, что функция rgbToHex возвращает строку с элементами после точки и требует, чтобы значения r, g, b находились в диапазоне 0-255.

Я уверен, что большинству это может показаться очевидным, но мне понадобилось два часа, чтобы понять, и к тому времени оригинальный метод увеличился до 7 строк, прежде чем я понял, что моя проблема в другом месте. Таким образом, в интересах экономии времени и хлопот, вот мой слегка исправленный код, который проверяет предварительные условия и удаляет посторонние фрагменты строки.

function rgbToHex(r, g, b) {
    if(r < 0 || r > 255) alert("r is out of bounds; "+r);
    if(g < 0 || g > 255) alert("g is out of bounds; "+g);
    if(b < 0 || b > 255) alert("b is out of bounds; "+b);
    return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1,7);
}
Мэтт Стивенс
источник
5

(2017) SIMPLE ES6 комбинируемые функции стрелок

Я не могу не поделиться этим для тех, кто может писать некоторые современные функциональные / композиционные Js с использованием ES6. Вот несколько простых строк, которые я использую в цветовом модуле, который выполняет интерполяцию цвета для визуализации данных.

Обратите внимание, что это не обрабатывает альфа-канал вообще.

const arrayToRGBString = rgb => `rgb(${rgb.join(',')})`;
const hexToRGBArray = hex => hex.match(/[A-Za-z0-9]{2}/g).map(v => parseInt(v, 16));
const rgbArrayToHex = rgb => `#${rgb.map(v => v.toString(16).padStart(2, '0')).join('')}`;
const rgbStringToArray = rgb => rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/).splice(1, 3)
  .map(v => Number(v));
const rgbStringToHex = rgb => rgbArrayToHex(rgbStringToArray(rgb));
Рон Гилкрист
источник
5

Пытаться

let hex2rgb= c=> `rgb(${c.substr(1).match(/../g).map(x=>+`0x${x}`)})`;
let rgb2hex= c=>'#'+c.match(/\d+/g).map(x=>(+x).toString(16).padStart(2,0)).join``

Камил Келчевски
источник
4

Если вам нужно сравнить два цветовых значения (заданные как RGB, имя цвета или шестнадцатеричное значение) или преобразовать в HEX, используйте объект холста HTML5.

var canvas = document.createElement("canvas");
var ctx = this.canvas.getContext('2d');

ctx.fillStyle = "rgb(pass,some,value)";
var temp =  ctx.fillStyle;
ctx.fillStyle = "someColor";

alert(ctx.fillStyle == temp);
Антон Путов
источник
3

Можете ли вы после чего-то вроде этого?

function RGB2HTML(red, green, blue)
{
    return '#' + red.toString(16) +
           green.toString(16) +
           blue.toString(16);
}

alert(RGB2HTML(150, 135, 200));

отображает # 9687c8

Микель
источник
1
> RGB2HTML> 2HTML> TO HTML (ಠ ʖ̯ ಠ) HEX не имеет отношения к HTML
Даниил Пронин
3

Для 3 цифр hexToRgb функция Tim Down может быть улучшена, как показано ниже:

var hex2Rgb = function(hex){
  var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})|([a-f\d]{1})([a-f\d]{1})([a-f\d]{1})$/i.exec(hex);
  return result ? {        
    r: parseInt(hex.length <= 4 ? result[4]+result[4] : result[1], 16),
    g: parseInt(hex.length <= 4 ? result[5]+result[5] : result[2], 16),
    b: parseInt(hex.length <= 4 ? result[6]+result[6] : result[3], 16),
    toString: function() {
      var arr = [];
      arr.push(this.r);
      arr.push(this.g);
      arr.push(this.b);
      return "rgb(" + arr.join(",") + ")";
    }
  } : null;
};
Erhan
источник
2

Я столкнулся с этой проблемой, поскольку хотел принять любое значение цвета и иметь возможность добавить непрозрачность, поэтому я создал этот быстрый плагин jQuery, который использует собственный холст в современных браузерах. Кажется, работает просто замечательно.

редактировать

Оказывается, я не могу понять, как сделать его правильным плагином jQuery, поэтому я просто представлю его как обычную функцию.

//accepts any value like '#ffffff', 'rgba(255,255,255,1)', 'hsl(0,100%,100%)', or 'white'
function toRGBA( c ) {
    var
        can  = document.createElement( 'canvas' ),
        ctx  = can.getContext( '2d' );
    can.width = can.height = 1;
    ctx.fillStyle = c;
    console.log( ctx.fillStyle ); //always css 6 digit hex color string, e.g. '#ffffff'
    ctx.fillRect( 0, 0, 1, 1 ); //paint the canvas
    var
        img  = ctx.getImageData( 0, 0, 1, 1 ),
        data = img.data,
        rgba = {
            r: data[ 0 ], //0-255 red
            g: data[ 1 ], //0-255 green
            b: data[ 2 ], //0-255 blue
            a: data[ 3 ]  //0-255 opacity (0 being transparent, 255 being opaque)
        };
    return rgba;
};
Патрик Робертс
источник
2

Мне нужна была функция, которая принимает недопустимые значения, такие как

RGB (-255, 255, 255) RGB (510, 255, 255)

это ответ @cwolves

function rgb(r, g, b) {
  this.c = this.c || function (n) {
    return Math.max(Math.min(n, 255), 0)
  };

  return ((1 << 24) + (this.c(r) << 16) + (this.c(g) << 8) + this.c(b)).toString(16).slice(1).toUpperCase();
}
Чад Скира
источник
2
R = HexToR("#FFFFFF");
G = HexToG("#FFFFFF");
B = HexToB("#FFFFFF");

function HexToR(h) {return parseInt((cutHex(h)).substring(0,2),16)}
function HexToG(h) {return parseInt((cutHex(h)).substring(2,4),16)}
function HexToB(h) {return parseInt((cutHex(h)).substring(4,6),16)}
function cutHex(h) {return (h.charAt(0)=="#") ? h.substring(1,7):h}

Используйте эти функции для достижения результата без каких-либо проблем. :)

user3767878
источник
2

Сокращенная версия, которая принимает строку:

function rgbToHex(a){
  a=a.replace(/[^\d,]/g,"").split(","); 
  return"#"+((1<<24)+(+a[0]<<16)+(+a[1]<<8)+ +a[2]).toString(16).slice(1)
}

document.write(rgbToHex("rgb(255,255,255)"));

Чтобы проверить, не является ли он уже шестнадцатеричным

function rgbToHex(a){
  if(~a.indexOf("#"))return a;
  a=a.replace(/[^\d,]/g,"").split(","); 
  return"#"+((1<<24)+(+a[0]<<16)+(+a[1]<<8)+ +a[2]).toString(16).slice(1)
}

document.write("rgb: "+rgbToHex("rgb(255,255,255)")+ " -- hex: "+rgbToHex("#e2e2e2"));

Аарт ден Брабер
источник
2

Хотя этот ответ вряд ли идеально подходит к вопросу, тем не менее он может быть очень полезным.

  1. Создать любой случайный элемент

var toRgb = document.createElement('div');

  1. Установите любой допустимый стиль для цвета, который вы хотите преобразовать

toRg.style.color = "hsl(120, 60%, 70%)";

  1. Вызовите свойство style снова

> toRgb.style.color;

< "rgb(133, 225, 133)" Ваш цвет был преобразован в Rgb

Работает для: Hsl, Hex

Не работает для: именованных цветов

Энтарра Де Лакорд
источник
Это может быть наиболее практичным ответом при работе с браузером. Вы часто просто хотите сравнить цвет некоторого существующего элемента с некоторым известным цветом, выраженным в # -обозначении.
Panu Logic
2

Моя версия hex2rbg:

  1. Принять короткий гекс, как #fff
  2. Алгоритм совместимости o (n), должен быстрее, чем с помощью регулярных выражений. например и String.replace, String.split, String.matchт.д ..
  3. Используйте постоянное пространство.
  4. Поддержка RGB и RGBA.

вам может понадобиться удалить hex.trim (), если вы используете IE8.

например

hex2rgb('#fff') //rgb(255,255,255) 
hex2rgb('#fff', 1) //rgba(255,255,255,1) 
hex2rgb('#ffffff') //rgb(255,255,255)  
hex2rgb('#ffffff', 1) //rgba(255,255,255,1)

код:

function hex2rgb (hex, opacity) {
    hex = hex.trim();
    hex = hex[0] === '#' ? hex.substr(1) : hex;
    var bigint = parseInt(hex, 16), h = [];
    if (hex.length === 3) {
        h.push((bigint >> 4) & 255);
        h.push((bigint >> 2) & 255);
    } else {
        h.push((bigint >> 16) & 255);
        h.push((bigint >> 8) & 255);
    }
    h.push(bigint & 255);
    if (arguments.length === 2) {
        h.push(opacity);
        return 'rgba('+h.join()+')';
    } else {
        return 'rgb('+h.join()+')';
    }
}
Эрик Чен
источник
Обратите внимание, что h.join(',')это то же самое, что и h.join().
2

Этот фрагмент преобразует гекс в rgb и rgb в гекс.

Посмотреть демо

function hexToRgb(str) { 
    if ( /^#([0-9a-f]{3}|[0-9a-f]{6})$/ig.test(str) ) { 
        var hex = str.substr(1);
        hex = hex.length == 3 ? hex.replace(/(.)/g, '$1$1') : hex;
        var rgb = parseInt(hex, 16);               
        return 'rgb(' + [(rgb >> 16) & 255, (rgb >> 8) & 255, rgb & 255].join(',') + ')';
    } 

    return false; 
}

function rgbToHex(red, green, blue) {
    var out = '#';

    for (var i = 0; i < 3; ++i) {
        var n = typeof arguments[i] == 'number' ? arguments[i] : parseInt(arguments[i]);

        if (isNaN(n) || n < 0 || n > 255) {
            return false;
        }

        out += (n < 16 ? '0' : '') + n.toString(16);
    }
    return out
}
user2240578
источник
Хорошо, как он обрабатывает сокращение, но может ли он вернуть структуру, а не строку?
Дунк
1

Я работаю с данными XAML, которые имеют шестнадцатеричный формат #AARRGGBB (альфа, красный, зеленый, синий). Используя ответы выше, вот мое решение:

function hexToRgba(hex) {
    var bigint, r, g, b, a;
    //Remove # character
    var re = /^#?/;
    var aRgb = hex.replace(re, '');
    bigint = parseInt(aRgb, 16);

    //If in #FFF format
    if (aRgb.length == 3) {
        r = (bigint >> 4) & 255;
        g = (bigint >> 2) & 255;
        b = bigint & 255;
        return "rgba(" + r + "," + g + "," + b + ",1)";
    }

    //If in #RRGGBB format
    if (aRgb.length >= 6) {
        r = (bigint >> 16) & 255;
        g = (bigint >> 8) & 255;
        b = bigint & 255;
        var rgb = r + "," + g + "," + b;

        //If in #AARRBBGG format
        if (aRgb.length == 8) {
            a = ((bigint >> 24) & 255) / 255;
            return "rgba(" + rgb + "," + a.toFixed(1) + ")";
        }
    }
    return "rgba(" + rgb + ",1)";
}

http://jsfiddle.net/kvLyscs3/

Бенсон
источник
1

Для конвертации напрямую из jQuery вы можете попробовать:

  function rgbToHex(color) {
    var bg = color.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
    function hex(x) {
      return ("0" + parseInt(x).toString(16)).slice(-2);
    }
    return     "#" + hex(bg[1]) + hex(bg[2]) + hex(bg[3]);
  }

  rgbToHex($('.col-tab-bar .col-tab span').css('color'))
Луис Амор
источник
1
function getRGB(color){
  if(color.length == 7){
    var r = parseInt(color.substr(1,2),16);
    var g = parseInt(color.substr(3,2),16);
    var b = parseInt(color.substr(5,2),16);    
    return 'rgb('+r+','+g+','+b+')' ;
  }    
  else
    console.log('Enter correct value');
}
var a = getRGB('#f0f0f0');
if(!a){
 a = 'Enter correct value'; 
}

a;
user3237573
источник
1

Учитывая большое количество ответов, ответьте на вопрос только частично (от RGB до HEX или наоборот), я решил опубликовать свой частичный ответ.

У меня была похожая проблема, и я хотел сделать что-то вроде этого: ввести любой допустимый цвет CSS (HSL (a), RGB (a), HEX или имя цвета) и 1. иметь возможность добавлять или удалять альфа-значение, 2. вернуть объект rgb (a). Я написал плагин именно для этой цели. Его можно найти на GitHub (для этого требуется jQuery, но при желании вы можете его разветвить и сделать ванильную версию). Вот демонстрационная страница . Вы можете попробовать для себя и увидеть результат, полученный на лету.

Я скопирую и вставлю варианты здесь:

RGB Generator принимает один аргумент, цвет и предоставляет три параметра: asObject, addAlpha и removeAlpha. Когда три параметра опущены, цвет RGB будет возвращен в виде строки.

$.rgbGenerator("white")
// Will return rgb(255,255,255)

Обратите внимание, что по умолчанию альфа-компоненты включены. Если входное значение содержит альфа-значение, вывод будет в формате RGBa.

$.rgbGenerator("hsla(0,100%,50%,0.8)")
// Will return rgba(255,0,0,0.8)

Вы можете отключить это поведение, установив для параметра removeAlpha значение true. Это удалит любое альфа-значение из исходного цвета HSLa или RGBa.

$.rgbGenerator("hsla(0,100%,50%,0.8)", {removeAlpha: true})
// Will return rgb(255,0,0)

Если, с другой стороны, вы хотите добавить альфа-канал, вы можете сделать это, установив addAlpha в любое значение от 0 до 1. Когда входной сигнал имеет непрозрачный цвет, альфа-значение будет добавлено. Если он прозрачный, предоставленное значение перезапишет альфа-компонент ввода.

$.rgbGenerator("hsl(0,100%,50%)", {addAlpha: 0.4})
// Will return rgba(255,0,0,0.4)
$.rgbGenerator("hsla(0,100%,50%,0.8)", {addAlpha: 0.4})
// Will return rgba(255,0,0,0.4)

Наконец, также возможно вывести цвет RGB (a) как объект. Он будет состоять из r, g, b и, необязательно, a.

$.rgbGenerator("hsla(0,100%,50%,0.8)", {asObject: true})
/* Will return
{
  "r": 255,
  "g": 0,
  "b": 0,
  "a": 0.8
}
*/
$.rgbGenerator("hsla(0,100%,50%,0.8)", {asObject: true}).r
// Will return 255
Брэм Ванрой
источник
1

Лучший ответ от Tim Down обеспечивает лучшее решение, которое я вижу для преобразования в RGB. Мне больше нравится это решение для шестнадцатеричного преобразования, потому что оно обеспечивает самую краткую проверку границ и заполнение нулями для преобразования в шестнадцатеричное.

function RGBtoHex (red, green, blue) {
  red = Math.max(0, Math.min(~~this.red, 255));
  green = Math.max(0, Math.min(~~this.green, 255));
  blue = Math.max(0, Math.min(~~this.blue, 255));

  return '#' + ('00000' + (red << 16 | green << 8 | blue).toString(16)).slice(-6);
};

Использование сдвига влево «<<» и или «|» операторы тоже делают это забавным решением.

srolfe26
источник
1

Я нашел это, и потому что я думаю, что это довольно просто и имеет проверочные тесты и поддерживает альфа-значения (необязательно), это будет соответствовать случаю.

Просто закомментируйте строку регулярного выражения, если вы знаете, что делаете, и это немного быстрее.

function hexToRGBA(hex, alpha){
    hex = (""+hex).trim().replace(/#/g,""); //trim and remove any leading # if there (supports number values as well)
    if (!/^(?:[0-9a-fA-F]{3}){1,2}$/.test(hex)) throw ("not a valid hex string"); //Regex Validator
    if (hex.length==3){hex=hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2]} //support short form
    var b_int = parseInt(hex, 16);
    return "rgba("+[
        (b_int >> 16) & 255, //R
        (b_int >> 8) & 255, //G
        b_int & 255, //B
        alpha || 1  //add alpha if is set
    ].join(",")+")";
}
redestructa
источник