Преобразовать 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)
*/

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.


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" в зависимости от того, хотите вы альфа-канал или нет.

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


В 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+')';
}

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

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


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>

Где же hexи rgbaфункции приходят?
Энди
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.