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


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

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


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)

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.


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)

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


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)

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)

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


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


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

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

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


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


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


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

¿De dónde vienen las funciones hexy rgba?
Andy
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.