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

Michael Schwartz
fonte
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)
*/
kennebec
fonte
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);

AJFarkas
fonte
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)
Lobster Fighter
fonte
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.

Chrillewoodz
fonte
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)
Ben Carp
fonte
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

Sajjad Hossain
fonte
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)
Jake
fonte
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)
Sverrisson
fonte
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

ElDoRado1239
fonte
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));

Peter Denev
fonte
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(', ')})`;
}
Geoff
fonte
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})`;
};
Nitzel
fonte
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})`

Kamil Kiełczewski
fonte
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

fdrv
fonte
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})`;
  }
Leo
fonte
-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>
napster3world
fonte
De onde vêm as funções hexe rgba?
Andy