Converter Hex em RGBA


86

Meu violino - http://jsbin.com/pitu/1/edit

Eu queria tentar uma conversão fácil de hex para rgba. Todos os navegadores que usei renderizam cores usando rgb como padrão, então, ao usar o seletor de cores farbtastic, estou convertendo o valor hexadecimal para rgb pegando a cor de fundo que o valor hexadecimal gera (como rgb por padrão = conversão simples)

Tentei substituir o )símbolo por , 1), mas não funcionou, então fui ver como a conversão de rgb em rgba funcionaria e ainda estou tendo problemas.

O jquery

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

O objetivo
insira a descrição da imagem aqui

EDITAR :

TinyColor É uma ótima biblioteca js de manipulação de cores que faz tudo que eu quero aqui e muito mais. Imagino que vocês queiram tentar! - https://github.com/bgrins/TinyColor


1
TinyColor É uma ótima biblioteca js de manipulação de cores que faz tudo que eu quero aqui e muito mais. Acho que vocês podem querer tentar!
Michael Schwartz

Respostas:


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
Obrigado .. Funcionou como um milagre .. :)
Manprit Singh Sahota

4
solução muito fácil de entender, mas não suporta hexágono de 8 formas como #ff0000aa?
supersan

1
Isso não funciona se a entrada não tiver exatamente 3 ou 6 caracteres.
Kehlan Krumme

92

@ ElDoRado1239 tem a ideia certa, mas também há uma maneira mais limpa:

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
Nota: isso falhará em atalhos HEX, por exemplo #fff. Isso deve ser facilmente corrigido!
Matthew Herbst,

1
Bem, sim, você tem que dar a função a entrada correta ...
AJFarkas

Muito legível, gosto muito mais do que da solução baseada em reg exp.
Dahrens,

Bom trabalho!! No entanto, tenho de mencionar uma pequena coisa. Tenho alguma experiência ruim em manter espaços entre a vírgula e os valores RGBA na string. (por exemplo: rgba (255, 35, 234, 0,5)). Especialmente se você passar esse valor para outro programa, esteja ciente disso. Porque existem alguns programas que não aceitam espaços entre os valores da string. Portanto, é melhor remover esses espaços da produção final.
Tharanga

eslinté apenas aplicação de estilo. É por acaso que nada do que escrevi contradiz suas preferências de estilo. Na verdade isso não passaria linting no projeto em que estou trabalhando atualmente, por exemplo.
AJFarkas

33

Função ES6 para lidar apenas com hex de 6 caracteres com ou sem o '#':

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

Uso:

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)

Como toStringon Arrayjunta - se com ,e a entrada de fato pode ser, rrggbbaa hexvocê pode alterá-lo para const rgb = hex.match (...). Slice (0,3) .map (...) returnn` $ {rgb}, $ {alpha } `;
Morteza Tourani

1
o código abaixo também converterá 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)); retorno rgba(${r},${g},${b},${alpha}); };
Serkan KONAKCI

14

Versão limpa do 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})`;
  }
}

Com base na resposta de @AJFarkas.


1
Isso não funciona sempre, em alguns casos, ele retorna NaN para r, g ou / e b.
Renascent de

Funcionou para mim! Thx
Saxofonista

10

Qualquer abordagem modular de forma hexadecimal

O principal desafio é que a partir de 2018 existem algumas formas de HEX. A forma tradicional de 6 caracteres, a forma abreviada de 3 caracteres e uma nova forma de 4 e 8 caracteres que inclui alfa. A função a seguir pode lidar com qualquer formato 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)})`
}

Alfa pode ser fornecido para a função das seguintes maneiras:

  1. Como parte de um HEX 4 ou 8.
  2. Como um segundo parâmetro entre 0-1,

Resultado

    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
Alguns navegadores suportam cores hexadecimais com opacidade, outros não. Esta resposta foi muito útil na conversão de hexadecimal 8 em rgba, sendo que rgba é compatível com todos os navegadores.
George

1
@George, obrigado! Depois de criar isso, perguntei a mim mesmo se essa abordagem abrangente é realmente necessária. Seu feedback é valioso.
Ben Carp

1
Eu acho que pode haver um pequeno bug no cálculo alfa. Eu acho que deveria ser: return a / 255, caso contrário FF não retorna 1
Dustin Kerstein

@DustinKerstein nice catch! Provavelmente não pode fazer mal, mas ainda assim deve ser consertado.
Ben Carp

1
Esta é a melhor resposta e funcionou para mim com todos os testes de unidade.
Menai Ala Eddine - Aladdin

9

Se você deseja converter hex para rgba, você pode usar esta função,

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

Aqui estão os detalhes de hex para rgba


8

Aqui está uma função que retorna rgb ou rgba se você fornecer um alfa. A função também converte códigos de cores hexadecimais curtos.

função:

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

exemplos:

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 moderno, livre de RegEx, solução com verificação de erros e função de seta constante, que retorna null para erros. Se alfa não for fornecido, o valor padrão de um será usado:

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

Nota: Ele retorna nullpara erros. Você pode substituir {return null;}por uma instrução throw:, {throw "Not a valid hex color!";}mas então você deve chamá-la de dentro try-catch:

hexToRGB("#3454r5") => null
hexToRGB("#345465") => rgba(52, 84, 101, 1)
hexToRGB("#345465", 0.5) => rgba(52, 84, 101, 0.5)

5

Solução JS pura se isso ajudar:

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

"alfaSim" é "verdadeiro" ou "falso" dependendo se você deseja o alfa ou não.

Antevisão


A elsepalavra-chave é desnecessária neste caso. Ele retornará o não-alfa independentemente.
Andy

Oh, sim, mas isso parece mais "arrumado" para mim. Acho que é apenas uma questão de preferência pessoal.
ElDoRado1239

Este código não funciona com hexadecimal em minúsculas (por exemplo #f0a16e). Sugiro para converter hexcom toUpperCaseprimeiro.
philippe_b

3

Gostei da resposta @AJFarkas e acrescentei o suporte para atalho hex (#fff) a ela

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

Aqui está uma versão ES2015 + que é um pouco mais defensiva e lida com a sintaxe abreviada de 3 dígitos.

/*
 * 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

E outro baseado em mudança de bit.

// 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

Tentar

// 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

Converta HEX com alfa (ahex) em 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+')';
}

Experimente você mesmo com o snippet:

Autor Original


0

Adicionando a @ ElDoRado1239

Para aqueles que desejam passar o valor alfa (snippet de typecript):

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

Tente isto

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

De onde vêm as funções hexe rgba?
Andy
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.