Convierta Hex a RGBA

86

Mi violín - http://jsbin.com/pitu/1/edit

Quería probar una conversión fácil de hexadecimal a rgba. Todos los navegadores que he usado renderizan colores usando rgb por defecto, así que cuando uso el selector de color farbtastic, estoy convirtiendo el valor hexadecimal a rgb tomando el color de fondo que genera el valor hexadecimal (como rgb por defecto = conversión simple)

Intenté reemplazar el )símbolo a , 1), pero no funcionó, así que fui a ver cómo funcionaba la conversión de rgb a rgba, y todavía tengo problemas.

El jquery

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

La meta
ingrese la descripción de la imagen aquí

EDITAR :

TinyColor es una gran biblioteca js de manipulación de color que hace todo lo que quiero aquí y más. ¡Creo que ustedes querrán intentarlo! - https://github.com/bgrins/TinyColor

Michael Schwartz
fuente
1
TinyColor es una gran biblioteca js de manipulación de color que hace todo lo que quiero aquí y más. ¡Creo que ustedes querrán intentarlo!
Michael Schwartz

Respuestas:

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
fuente
1
Gracias .. Funcionó como un milagro .. :)
Manprit Singh Sahota
4
¿Solución muy fácil de entender pero no es compatible con 8 formas hexadecimales #ff0000aa?
supersan
1
Esto no funciona si la entrada no tiene exactamente 3 o 6 caracteres.
Kehlan Krumme
93

@ ElDoRado1239 tiene la idea correcta, pero también hay una forma más limpia:

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
fuente
1
Nota: esto fallará en los atajos HEX, por ejemplo #fff. ¡Eso debería ser fácilmente reparable!
Matthew Herbst
1
Bueno, sí, tienes que darle a la función la entrada correcta…
AJFarkas
Muy legible, me gusta mucho más que la solución basada en reg exp.
Dahrens
¡¡Buen trabajo!! Sin embargo, tengo que mencionar una pequeña cosa. Tengo una mala experiencia de mantener espacios entre la coma y los valores RGBA en la cadena. (por ejemplo: rgba (255, 35, 234, 0.5)). Especialmente si pasa este valor a otro programa, tenga en cuenta eso. Porque hay algunos programas que no aceptan espacios entre valores en la cadena. Entonces, es mejor eliminar esos espacios de la salida final.
Tharanga
eslintes solo aplicación de estilo. Es solo por casualidad que nada de lo que escribí contradice tus preferencias de estilo. De hecho, esto no dejaría de lado el proyecto en el que estoy trabajando actualmente, por ejemplo.
AJFarkas
33

Función ES6 para solo manejar hexadecimales de 6 caracteres con o sin el '#':

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)
Luchador de langosta
fuente
Dado que toStringon se Arrayune con ,y la entrada de hecho puede ser rrggbbaa hex, puede cambiarlo a const rgb = hex.match (...). Slice (0,3) .map (...) returnn` $ {rgb}, $ {alpha } `;
Morteza Tourani
1
el código siguiente también convertirá 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)); volver rgba(${r},${g},${b},${alpha}); };
Serkan KONAKCI
14

Versión limpia de 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})`;
  }
}

Basado en la respuesta de @ AJFarkas.

Chrillewoodz
fuente
1
Esto no funciona cada vez que en algunos casos devuelve NaN para r, go / y b.
Renacido
¡Funcionó para mí! Thx
Saxofonista
10

Cualquier enfoque modular de forma hexagonal

El principal desafío es que a partir de 2018 existen algunas formas de HEX. La forma tradicional de 6 caracteres, la forma abreviada de 3 caracteres y una nueva forma de 4 y 8 caracteres que incluye alfa. La siguiente función puede manejar cualquier forma 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)})`
}

Alpha podría proporcionarse a la función de las siguientes formas:

  1. Como parte de una forma HEX de 4 u 8.
  2. Como segundo parámetro entre 0-1,

Salida

    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
fuente
1
Algunos navegadores admiten colores hexadecimales con opacidad, otros no. Esta respuesta fue muy útil para convertir 8 formatos hexadecimales a rgba, rgba es compatible con todos los navegadores.
George
1
@George, ¡Gracias! Después de crear esto, me pregunté si realmente era necesario un enfoque tan completo. Tus comentarios son valiosos.
Ben Carp
1
Creo que puede haber un pequeño error en el cálculo alfa. Creo que debería leer: devuelve un / 255 de lo contrario FF no devuelve 1
Dustin Kerstein
@DustinKerstein ¡buena captura! Probablemente no pueda hacer daño, pero aún así debería arreglarse.
Ben Carp
1
Esta es la mejor respuesta y me funcionó con todas las pruebas unitarias.
Menai Ala Eddine - Aladdin
9

Si desea convertir hexadecimal a rgba, puede usar esta función,

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

Aquí hay detalles es hexadecimal a rgba

Sajjad Hossain
fuente
8

Aquí hay una función que devuelve rgb o rgba si proporciona un alfa. La función también convierte códigos de color hexadecimales cortos.

función:

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

ejemplos:

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

ES6 solución moderna, sin RegEx, con verificación de errores y función de flecha constante, que devuelve nulos para errores. Si no se proporciona alfa, se utiliza el valor predeterminado de uno:

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: Vuelve nullpor errores. Puede reemplazarlo {return null;}con una instrucción throw:, {throw "Not a valid hex color!";}pero luego debe llamarlo desde dentro try-catch:

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

Solución JS pura si ayuda:

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" es "verdadero" o "falso" dependiendo de si desea el alfa o no.

Avance

ElDoRado1239
fuente
La elsepalabra clave es innecesaria en este caso. Devolverá el no alfa independientemente.
Andy
Oh, sí, pero esto me parece más "ordenado". Supongo que es una cuestión de preferencia personal.
ElDoRado1239
Este código no funciona con hexadecimal en minúsculas (p. Ej. #f0a16e). Sugiero convertir hexcon toUpperCaseprimero.
philippe_b
3

Me gustó la respuesta de @AJFarkas y le agrego el soporte para hexadecimal de acceso directo (#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));

Peter Denev
fuente
3

Aquí hay una versión de ES2015 + que es un poco más defensiva y maneja la sintaxis taquigráfica 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
fuente
1

Y otro basado en el cambio de bits.

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

Tratar

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

Convierta HEX con alpha (ahex) en 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+')';
}

Pruébelo usted mismo con el fragmento:

Autor original

fdrv
fuente
0

Añadiendo a @ ElDoRado1239

Para aquellos que quieran pasar el valor alfa (fragmento de texto mecanografiado):

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})`;
  }
León
fuente
-9

Prueba esto

<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
fuente
¿De dónde vienen las funciones hexy rgba?
Andy