Converti esadecimale in RGBA


86

Il mio violino - http://jsbin.com/pitu/1/edit

Volevo provare una facile conversione da esadecimale a rgba. Tutti i browser che ho usato rendono i colori usando rgb come impostazione predefinita, quindi quando si utilizza il selettore di colori farbtastic sto convertendo il valore esadecimale in rgb afferrando il colore di sfondo che il valore esadecimale genera (come rgb per impostazione predefinita = conversione semplice)

Ho provato a sostituire il )simbolo con , 1), ma non ha funzionato, quindi sono andato a vedere come funzionerebbe la conversione da rgb a rgba, e ho ancora problemi.

Il jquery

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

L'obiettivo. il gol
inserisci qui la descrizione dell'immagine

MODIFICA :

TinyColor È un'ottima libreria js per la manipolazione del colore che fa tutto ciò che voglio qui e altro ancora. Immagino che voi ragazzi potreste voler fare un tentativo! - https://github.com/bgrins/TinyColor


1
TinyColor È un'ottima libreria js per la manipolazione del colore che fa tutto ciò che voglio qui e altro ancora. Immagino che voi ragazzi potreste voler fare un tentativo!
Michael Schwartz

Risposte:


160
//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
Grazie .. Ha funzionato come un miracolo .. :)
Manprit Singh Sahota

4
soluzione molto facile da capire ma non supporta 8 moduli esadecimali come #ff0000aa?
supersan

1
Questo non funziona se l'input non è esattamente di 3 o 6 caratteri.
Kehlan Krumme

97

@ ElDoRado1239 ha l'idea giusta, ma c'è anche un modo più pulito:

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: questo fallirà con le scorciatoie HEX, ad es #fff. Dovrebbe essere facilmente risolvibile però!
Matthew Herbst

1
Bene, sì, devi dare alla funzione l'input corretto ...
AJFarkas

Molto leggibile, mi piace molto di più della soluzione basata su reg exp.
dahrens

Bel lavoro!! Una piccola cosa che devo menzionare però. Ho una brutta esperienza nel mantenere gli spazi tra la virgola ei valori RGBA nella stringa. (ad esempio: rgba (255, 35, 234, 0.5)). Soprattutto se passi questo valore a un altro programma, tienilo a mente. Perché ci sono alcuni programmi che non accettano spazi tra i valori nella stringa. Quindi, meglio rimuovere quegli spazi dall'output finale.
Tharanga

eslintè solo l'applicazione dello stile. È solo un caso che nulla di ciò che ho scritto contraddica le tue preferenze di stile. In effetti, questo non passerebbe linting sul progetto a cui sto attualmente lavorando, ad esempio.
AJFarkas

34

Funzione ES6 per gestire solo 6 caratteri esadecimali con o senza il '#':

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

Utilizzo:

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)

Dato che toStringsu si Arrayunisce a ,e l'input del fatto può essere rrggbbaa hex, puoi cambiarlo in const rgb = hex.match (...). Slice (0,3) .map (...) returnn` $ {rgb}, $ {alpha } `;
Morteza Tourani

1
il codice sottostante convertirà anche 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)); ritorno rgba(${r},${g},${b},${alpha}); };
Serkan KONAKCI

17

Versione Clean 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 `rgb(${r}, ${g}, ${b})`;
  }
}

Basato sulla risposta di @ AJFarkas.


1
Questo non funziona ogni volta che in alcuni casi restituisce NaN per r, go / e b.
Rinascita

Ha funzionato per me! Thx
Saxophonist

non dovrebbe tornare l'altro rgb(${r}, ${g}, ${b})poiché non avrà un alfa?
Amanshu Kataria,

@AmanshuKataria Sì, dovrebbe. Buon posto.
Chrillewoodz

10

Qualsiasi approccio modulare a forma esagonale

La sfida principale è che a partire dal 2018 ci sono alcune forme di HEX. La forma tradizionale a 6 caratteri, la forma abbreviata a 3 caratteri e una nuova forma a 4 e 8 caratteri che include alfa. La seguente funzione può gestire qualsiasi 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 potrebbe essere fornito alla funzione nei seguenti modi:

  1. Come parte di un formato 4 o 8 HEX.
  2. Come secondo parametro tra 0-1,

Produzione

    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
Alcuni browser supportano i colori esadecimali con opacità, altri no. Questa risposta è stata molto utile per convertire 8 form hex in rgba, essendo rgba supportato in tutti i browser.
George

1
@George, grazie! Dopo aver creato questo, mi sono chiesto se un approccio così completo sia effettivamente necessario. Il tuo feedback è prezioso.
Ben Carp

1
Penso che potrebbe esserci 1 minuscolo bug nel calcolo alpha. Penso che dovrebbe leggere: return a / 255 altrimenti FF non restituisce 1
Dustin Kerstein

@DustinKerstein bella cattura! Probabilmente non può fare del male, ma dovrebbe comunque essere riparato.
Ben Carp

1
Questa è la risposta migliore e ha funzionato per me con tutti i test unitari.
Menai Ala Eddine - Aladdin

8

Ecco una funzione che restituisce rgb o rgba se fornisci un alpha. La funzione converte anche codici colore esadecimali brevi.

funzione:

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

esempi:

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

Soluzione ES6 moderna, senza RegEx, con controllo degli errori e funzione freccia costante, che restituisce null per gli errori. Se alpha non viene fornito, viene utilizzato il valore predefinito di 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: restituisce nullper errori. Puoi sostituire {return null;}con un'istruzione throw:, {throw "Not a valid hex color!";}ma dovresti chiamarla dall'interno try-catch:

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

5

Soluzione Pure JS se aiuta:

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" o "false" a seconda che si desideri o meno l'alfa.

Anteprima


La elseparola chiave non è necessaria in questo caso. Restituirà il non alfa a prescindere.
Andy

Oh, sì, ma questo mi sembra più "ordinato". È solo una questione di preferenze personali, immagino.
ElDoRado 1239

Questo codice non funziona con esadecimale minuscolo (es. #f0a16e). Suggerisco di convertire prima hexcon toUpperCase.
philippe_b

3

Mi è piaciuta la risposta di @AJFarkas e ho aggiunto il supporto per la scorciatoia hex (#fff) ad essa

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

Ecco una versione ES2015 + che è un po 'più difensiva e gestisce la sintassi abbreviata a 3 cifre.

/*
 * 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 un altro basato sullo spostamento dei 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

Provare

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


1

Ecco una funzione rapida che supporta codici colore a 3, 4, 6 e 8 caratteri:

function hexToRGBA(hex) {
    // remove invalid characters
    hex = hex.replace(/[^0-9a-fA-F]/g, '');

    if (hex.length < 5) { 
        // 3, 4 characters double-up
        hex = hex.split('').map(s => s + s).join('');
    }

    // parse pairs of two
    let rgba = hex.match(/.{1,2}/g).map(s => parseInt(s, 16));

    // alpha code between 0 & 1 / default 1
    rgba[3] = rgba.length > 3 ? parseFloat(rgba[3] / 255).toFixed(2): 1;

    return 'rgba(' + rgba.join(', ') + ')';
}

Ecco cosa fa. Rimuove tutti i caratteri non esadecimali. Se l'HEX è più corto di 5 (3 o 4) caratteri, raddoppia ogni carattere. Quindi divide l'HEX in coppie di due caratteri e analizza ogni coppia in un numero intero. Se è presente un HEX alfa, viene analizzato in un float da 0 a 1, altrimenti è impostato su 1. La stringa RGBA viene quindi formata unendo l'array e restituita.


0

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

Prova tu stesso con lo snippet:

Autore originale


0

Aggiunta a @ ElDoRado1239

Per coloro che desiderano trasmettere il valore alfa (frammento di dattiloscritto):

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

Prova questo

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

Da dove vengono le funzioni hexe rgba?
Andy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.