Преобразовать Hex в RGBA

86

Моя скрипка - http://jsbin.com/pitu/1/edit

Я хотел попробовать простое преобразование hex в rgba. Когда-либо браузер, который я использовал, отображает цвета с использованием rgb по умолчанию, поэтому при использовании Farbtastic выбора цвета я конвертирую шестнадцатеричное значение в rgb, захватывая цвет фона, который генерирует шестнадцатеричное значение (как rgb по умолчанию = простое преобразование)

Я попытался заменить )символ на , 1), но это не сработало, поэтому я пошел просто посмотреть, как будет работать преобразование rgb в rgba, и у меня все еще возникают проблемы.

Jquery

$('.torgb').val($('#color').css('background-color'));
$('.torgba').val().replace(/rgb/g,"rgba");

Цель
введите описание изображения здесь

ИЗМЕНИТЬ :

TinyColor - отличная js-библиотека для управления цветом, которая делает все, что я хочу здесь, и даже больше. Я полагаю, вы, ребята, можете захотеть попробовать! - https://github.com/bgrins/TinyColor

Майкл Шварц
источник
1
TinyColor - отличная js-библиотека для управления цветом, которая делает все, что я хочу здесь, и даже больше. Я полагаю, вы, ребята, можете попробовать!
Майкл Шварц

Ответы:

155
//If you write your own code, remember hex color shortcuts (eg., #fff, #000)

function hexToRgbA(hex){
    var c;
    if(/^#([A-Fa-f0-9]{3}){1,2}$/.test(hex)){
        c= hex.substring(1).split('');
        if(c.length== 3){
            c= [c[0], c[0], c[1], c[1], c[2], c[2]];
        }
        c= '0x'+c.join('');
        return 'rgba('+[(c>>16)&255, (c>>8)&255, c&255].join(',')+',1)';
    }
    throw new Error('Bad Hex');
}

hexToRgbA('#fbafff')

/*  returned value: (String)
rgba(251,175,255,1)
*/
Kennebec
источник
1
Спасибо ..
Сработало
4
очень простое для понимания решение, но оно не поддерживает 8 шестнадцатеричных форм, например #ff0000aa?
supersan
1
Это не работает, если введено не ровно 3 или 6 символов.
Кехлан Крумме,
93

@ ElDoRado1239 имеет правильную идею, но есть и более чистый способ:

function hexToRGB(hex, alpha) {
    var r = parseInt(hex.slice(1, 3), 16),
        g = parseInt(hex.slice(3, 5), 16),
        b = parseInt(hex.slice(5, 7), 16);

    if (alpha) {
        return "rgba(" + r + ", " + g + ", " + b + ", " + alpha + ")";
    } else {
        return "rgb(" + r + ", " + g + ", " + b + ")";
    }
}

hexToRGB('#FF0000', 0.5);

А.Дж.Фаркас
источник
1
Примечание: это не сработает для ярлыков HEX, например #fff. Это должно быть легко поправимо!
Мэтью Хербст
1
Ну да, вы должны дать функции правильный ввод ...
AJFarkas
Очень удобочитаемый, мне он нравится больше, чем решение на основе reg exp.
dahrens
Хорошая работа!! Однако я должен упомянуть одну мелочь. У меня плохой опыт сохранения пробелов между запятой и значениями RGBA в строке. (например: rgba (255, 35, 234, 0.5)). Помните об этом, особенно если вы передадите это значение другой программе. Потому что есть программы, которые не принимают пробелы между значениями в строке. Итак, лучше удалить эти пробелы из окончательного вывода.
Тхаранга,
eslintэто просто соблюдение стиля. Только случайно ничто из написанного мной не противоречит вашим стилевым предпочтениям. Фактически, это не пройдет, например, над проектом, над которым я сейчас работаю.
AJFarkas
33

Функция ES6 только для обработки шестнадцатеричных символов с символом # или без него:

const hex2rgba = (hex, alpha = 1) => {
  const [r, g, b] = hex.match(/\w\w/g).map(x => parseInt(x, 16));
  return `rgba(${r},${g},${b},${alpha})`;
};

Применение:

hex2rgba('#af087b', .5)   // returns: rgba(175,8,123,0.5)
hex2rgba('af087b', .5)    // returns: rgba(175,8,123,0.5)
hex2rgba('af087b')        // returns: rgba(175,8,123,1)
Истребитель омаров
источник
Так как toStringпри Arrayобъединении с ,и ввод факта может быть, rrggbbaa hexвы можете изменить его на const rgb = hex.match (...). Slice (0,3) .map (...) returnn` $ {rgb}, $ {alpha } `;
Morteza Tourani
1
приведенный ниже код также преобразует hex2rgba ('# 369', 0.5); var hex2rgba = (hex, alpha = 1) => {const [r, g, b] = hex.match (hex.length <= 4? / \ w / g: / \ w \ w / g) .map ( x => parseInt (x.length <2?: ${x}${x}x, 16)); возврат rgba(${r},${g},${b},${alpha}); };
Серкан КОНАКЧИ
14

Чистая версия TypeScript:

hexToRGB(hex: string, alpha: string) {

  const r = parseInt(hex.slice(1, 3), 16);
  const g = parseInt(hex.slice(3, 5), 16);
  const b = parseInt(hex.slice(5, 7), 16);

  if (alpha) {
    return `rgba(${r}, ${g}, ${b}, ${alpha})`;
  } else {
    return `rgba(${r}, ${g}, ${b})`;
  }
}

На основе ответа @ AJFarkas.

Chrillewoodz
источник
1
Это не работает каждый раз, в некоторых случаях он возвращает NaN для r, g или / и b.
Renascent
У меня получилось! Спасибо
Саксофонист
10

Модульный подход любой формы шестигранника

Основная проблема заключается в том, что по состоянию на 2018 год существует несколько форм HEX. Традиционная форма из 6 символов, сокращенная форма из 3 символов и новая форма из 4 и 8 символов, которая включает альфа. Следующая функция может обрабатывать любую HEX-форму.

const isValidHex = (hex) => /^#([A-Fa-f0-9]{3,4}){1,2}$/.test(hex)

const getChunksFromString = (st, chunkSize) => st.match(new RegExp(`.{${chunkSize}}`, "g"))

const convertHexUnitTo256 = (hexStr) => parseInt(hexStr.repeat(2 / hexStr.length), 16)

const getAlphafloat = (a, alpha) => {
    if (typeof a !== "undefined") {return a / 255}
    if ((typeof alpha != "number") || alpha <0 || alpha >1){
      return 1
    }
    return alpha
}

export const hexToRGBA = (hex, alpha) => {
    if (!isValidHex(hex)) {throw new Error("Invalid HEX")}
    const chunkSize = Math.floor((hex.length - 1) / 3)
    const hexArr = getChunksFromString(hex.slice(1), chunkSize)
    const [r, g, b, a] = hexArr.map(convertHexUnitTo256)
    return `rgba(${r}, ${g}, ${b}, ${getAlphafloat(a, alpha)})`
}

Альфа-версия может быть предоставлена ​​функции следующими способами:

  1. Как часть 4 или 8 формы HEX.
  2. В качестве второго параметра между 0-1,

Выход

    const c1 = "#f80"
    const c2 = "#f808"
    const c3 = "#0088ff"
    const c4 = "#0088ff88"
    const c5 = "#98736"

    console.log(hexToRGBA(c1))   //  rgba(255, 136, 0, 1)
    console.log(hexToRGBA(c2))   //  rgba(255, 136, 0, 0.53125)
    console.log(hexToRGBA(c3))   //  rgba(0, 136, 255, 1)
    console.log(hexToRGBA(c4))   //  rgba(0, 136, 255, 0.53125)
    console.log(hexToRGBA(c5))   //  Uncaught Error: Invalid HEX

    console.log(hexToRGBA(c1, 0.5))   //  rgba(255, 136, 0, 0.5)
    console.log(hexToRGBA(c3, 0.5))   //  rgba(0, 136, 255, 0.5)
Бен Карп
источник
1
Некоторые браузеры поддерживают шестнадцатеричные цвета с непрозрачностью, другие - нет. Этот ответ был очень полезен при преобразовании 8-ми шестнадцатеричных форм в rgba, причем rgba поддерживается во всех браузерах.
Джордж
1
@ Джордж, спасибо! После его создания я спросил себя, действительно ли необходим такой комплексный подход. Ваш отзыв очень важен.
Бен Карп
1
Думаю, в альфа-расчете может быть одна крошечная ошибка. Думаю, следует читать: return a / 255, иначе FF не вернет 1
Дастин Керштейн
@DustinKerstein хороший улов! Наверное, не может навредить, но все же следует исправить.
Бен Карп,
1
Это лучший ответ, и он работал у меня со всеми модульными тестами.
Менай Ала Эддин - Аладдин,
9

Если вы хотите преобразовать шестнадцатеричный формат в rgba, вы можете использовать эту функцию,

function hex2rgba_convert(hex,opacity){
 hex = hex.replace('#','');
 r = parseInt(hex.substring(0, hex.length/3), 16);
 g = parseInt(hex.substring(hex.length/3, 2*hex.length/3), 16);
 b = parseInt(hex.substring(2*hex.length/3, 3*hex.length/3), 16);

 result = 'rgba('+r+','+g+','+b+','+opacity/100+')';
 return result;
}

Вот подробности hex to rgba

Саджад Хоссейн
источник
8

Вот функция, которая возвращает rgb или rgba, если вы предоставили альфа-канал. Функция также конвертирует короткие шестнадцатеричные цветовые коды.

функция:

function hexToRgb(hex, alpha) {
   hex   = hex.replace('#', '');
   var r = parseInt(hex.length == 3 ? hex.slice(0, 1).repeat(2) : hex.slice(0, 2), 16);
   var g = parseInt(hex.length == 3 ? hex.slice(1, 2).repeat(2) : hex.slice(2, 4), 16);
   var b = parseInt(hex.length == 3 ? hex.slice(2, 3).repeat(2) : hex.slice(4, 6), 16);
   if ( alpha ) {
      return 'rgba(' + r + ', ' + g + ', ' + b + ', ' + alpha + ')';
   }
   else {
      return 'rgb(' + r + ', ' + g + ', ' + b + ')';
   }
}

Примеры:

hexToRgb('FF0000');// rgb(255, 0, 0)
hexToRgb('#FF0000');// rgb(255, 0, 0)
hexToRgb('#FF0000', 1);// rgba(255, 0, 0, 1)
hexToRgb('F00');// rgb(255, 0, 0)
hexToRgb('#F00');// rgb(255, 0, 0)
hexToRgb('#F00', 1);// rgba(255, 0, 0, 1)
Джейк
источник
6

ES6 modern, без RegEx , решение с проверкой ошибок и постоянной стрелочной функцией, которая возвращает null для ошибок. Если альфа не задана, используется значение по умолчанию, равное единице:

const hexToRGB = (hex, alpha = 1) => {
    let parseString = hex;
    if (hex.startsWith('#')) {parseString = hex.slice(1, 7);}
    if (parseString.length !== 6) {return null;}
    const r = parseInt(parseString.slice(0, 2), 16);
    const g = parseInt(parseString.slice(2, 4), 16);
    const b = parseInt(parseString.slice(4, 6), 16);
    if (isNaN(r) || isNaN(g) || isNaN(b)) {return null;}
    return `rgba(${r}, ${g}, ${b}, ${alpha})`;
};

Примечание: возвращается nullпри ошибках. Вы можете заменить {return null;}оператором throw:, {throw "Not a valid hex color!";}но тогда вы должны вызвать его изнутри try-catch:

hexToRGB("#3454r5") => null
hexToRGB("#345465") => rgba(52, 84, 101, 1)
hexToRGB("#345465", 0.5) => rgba(52, 84, 101, 0.5)
Сверриссон
источник
5

Решение на чистом JS, если оно помогает:

function hexToRGB(hex,alphaYes){
 var h = "0123456789ABCDEF";
 var r = h.indexOf(hex[1])*16+h.indexOf(hex[2]);
 var g = h.indexOf(hex[3])*16+h.indexOf(hex[4]);
 var b = h.indexOf(hex[5])*16+h.indexOf(hex[6]);
 if(alphaYes) return "rgba("+r+", "+g+", "+b+", 1)";
 else return "rgb("+r+", "+g+", "+b+")";
}

"alphaYes" принимает значение "true" или "false" в зависимости от того, хотите вы альфа-канал или нет.

Предварительный просмотр

ЭльДорадо1239
источник
В elseэтом случае ключевое слово не нужно. Он вернет не-альфа независимо.
Энди
Ах да, но мне это кажется более "опрятным". Думаю, дело в личных предпочтениях.
ElDoRado1239
Этот код не работает со строчными шестнадцатеричными (например #f0a16e). Я предлагаю , чтобы преобразовать hexс toUpperCaseпервой.
philippe_b
3

Мне понравился ответ @AJFarkas, и я добавил к нему поддержку ярлыка hex (#fff)

function hexToRGB(hex, alpha) {
    if (!hex || [4, 7].indexOf(hex.length) === -1) {
        return; // throw new Error('Bad Hex');
    }

    hex = hex.substr(1);
    // if shortcuts (#F00) -> set to normal (#FF0000)
    if (hex.length === 3) { 
        hex = hex.split('').map(function(el){ 
              return el + el + '';
            }).join('');
    }

    var r = parseInt(hex.slice(0, 2), 16),
        g = parseInt(hex.slice(2, 4), 16),
        b = parseInt(hex.slice(4, 6), 16);

    if (alpha !== undefined) {
        return "rgba(" + r + ", " + g + ", " + b + ", " + alpha + ")";
    } else {
        return "rgb(" + r + ", " + g + ", " + b + ")";
    }
}

document.write(hexToRGB('#FF0000', 0.5));
document.write('<br>');
document.write(hexToRGB('#F00', 0.4));

Петр Денев
источник
3

Вот версия ES2015 +, которая немного более защищена и обрабатывает сокращенный трехзначный синтаксис.

/*
 * Takes a 3 or 6-digit hex color code, and an optional 0-255 numeric alpha value
 */
function hexToRGB(hex, alpha) {
  if (typeof hex !== 'string' || hex[0] !== '#') return null; // or return 'transparent'

  const stringValues = (hex.length === 4)
        ? [hex.slice(1, 2), hex.slice(2, 3), hex.slice(3, 4)].map(n => `${n}${n}`)
        : [hex.slice(1, 3), hex.slice(3, 5), hex.slice(5, 7)];
  const intValues = stringValues.map(n => parseInt(n, 16));

  return (typeof alpha === 'number')
    ? `rgba(${intValues.join(', ')}, ${alpha})`
    : `rgb(${intValues.join(', ')})`;
}
Джефф
источник
1

И еще один, основанный на сдвиге битов.

// hex can be a string in the format of "fc9a04", "0xfc9a04" or "#fc90a4" (uppercase digits are allowed) or the equivalent number
// alpha should be 0-1
const hex2rgb = (hex, alpha) => {
  const c = typeof(hex) === 'string' ? parseInt(hex.replace('#', ''), 16)  : hex;
  return `rgb(${c >> 16}, ${(c & 0xff00) >> 8}, ${c & 0xff}, ${alpha})`;
};
Нитцель
источник
1

Пытаться

// hex - str e.g. "#abcdef"; a - alpha range 0-1; result e.g. "rgba(1,1,1,0)"
let hex2rgba= (hex,a)=> `rgb(${hex.substr(1).match(/../g).map(x=>+`0x${x}`)},${a})`

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

Преобразуйте HEX с альфа (ahex) в rgba.

function ahex_to_rba(ahex) {
    //clean #
    ahex = ahex.substring(1, ahex.length);
    ahex = ahex.split('');

    var r = ahex[0] + ahex[0],
        g = ahex[1] + ahex[1],
        b = ahex[2] + ahex[2],
        a = ahex[3] + ahex[3];

    if (ahex.length >= 6) {
        r = ahex[0] + ahex[1];
        g = ahex[2] + ahex[3];
        b = ahex[4] + ahex[5];
        a = ahex[6] + (ahex[7] ? ahex[7] : ahex[6]);
    }

    var int_r = parseInt(r, 16),
        int_g = parseInt(g, 16),
        int_b = parseInt(b, 16),
        int_a = parseInt(a, 16);


    int_a = int_a / 255;

    if (int_a < 1 && int_a > 0) int_a = int_a.toFixed(2);

    if (int_a || int_a === 0)
        return 'rgba('+int_r+', '+int_g+', '+int_b+', '+int_a+')';
    return 'rgb('+int_r+', '+int_g+', '+int_b+')';
}

Попробуйте сами с помощью фрагмента:

Автор оригинала

fdrv
источник
0

Добавление в @ ElDoRado1239

Для тех, кто хочет передать альфа-значение (фрагмент машинописного текста):

static hexToRGB(hex: string, alpha: number): string {
    var h = "0123456789ABCDEF";
    var r = h.indexOf(hex[1]) * 16 + h.indexOf(hex[2]);
    var g = h.indexOf(hex[3]) * 16 + h.indexOf(hex[4]);
    var b = h.indexOf(hex[5]) * 16 + h.indexOf(hex[6]);
    if (alpha) {
      return `rgba(${r}, ${g}, ${b}, ${alpha})`
    }

    return `rgba(${r}, ${g}, ${b})`;
  }
Лео
источник
-9

Попробуй это

<div class="torgb" onclick="rgba();" style="background-color:#000; width:20px; height:20px;"></div>
<script>
function rgba(){
$('.torgb').attr('background-color','rgba(0,0,0,1)');
$('.torgb').attr('onclick','hex();');
}
function hex(){
$('.torgb').attr('background-color','#000');
$('.torgb').attr('onclick','rgba();');
}
</script>
napster3world
источник
Где же hexи rgbaфункции приходят?
Энди