Hex in RGBA konvertieren

86

Meine Geige - http://jsbin.com/pitu/1/edit

Ich wollte eine einfache Hex-zu-RGBA-Konvertierung versuchen. Jeder Browser, den ich verwendet habe, rendert Farben standardmäßig mit RGB. Wenn ich also den Farbtastic-Farbwähler verwende, konvertiere ich den Hex-Wert in RGB, indem ich die Hintergrundfarbe greife, die der Hex-Wert generiert (standardmäßig RGB = einfache Konvertierung).

Ich habe versucht, das )Symbol durch zu ersetzen , 1), aber das hat nicht funktioniert, also habe ich mir angesehen, wie die Konvertierung von rgb in rgba funktionieren würde, und ich habe immer noch Probleme.

Die Frage

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

Das Ziel
Geben Sie hier die Bildbeschreibung ein

EDIT :

TinyColor ist eine großartige js-Bibliothek zur Farbmanipulation, die alles macht, was ich hier will und mehr. Ich denke, ihr wollt es vielleicht versuchen! - https://github.com/bgrins/TinyColor

Michael Schwartz
quelle
1
TinyColor ist eine großartige js-Bibliothek zur Farbmanipulation, die alles macht, was ich hier will und mehr. Ich denke, ihr wollt es vielleicht versuchen!
Michael Schwartz

Antworten:

159
//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
quelle
1
Vielen Dank .. Arbeitete wie ein Wunder .. :)
Manprit Singh Sahota
4
sehr einfach zu verstehende Lösung, aber es unterstützt nicht 8 Form Hex wie #ff0000aa?
Supersan
1
Dies funktioniert nicht, wenn die Eingabe nicht genau aus 3 oder 6 Zeichen besteht.
Kehlan Krumme
95

@ ElDoRado1239 hat die richtige Idee, aber es gibt auch einen saubereren Weg:

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
quelle
1
Hinweis: Dies schlägt bei HEX-Verknüpfungen fehl, z #fff. Das sollte aber leicht zu beheben sein!
Matthew Herbst
1
Nun ja, Sie müssen der Funktion die richtige Eingabe geben ...
AJFarkas
Sehr gut lesbar, ich mag es viel mehr als die reg exp-basierte Lösung.
Dahrens
Gute Arbeit!! Eine Kleinigkeit muss ich allerdings erwähnen. Ich habe einige schlechte Erfahrungen damit gemacht, Leerzeichen zwischen Komma und den RGBA-Werten in der Zeichenfolge zu halten. (zB: rgba (255, 35, 234, 0,5)). Beachten Sie dies, insbesondere wenn Sie diesen Wert an ein anderes Programm übergeben. Weil es einige Programme gibt, die keine Leerzeichen zwischen Werten in der Zeichenfolge akzeptieren. Entfernen Sie diese Leerzeichen besser aus der endgültigen Ausgabe.
Tharanga
eslintist nur Stildurchsetzung. Es ist nur ein Zufall, dass nichts, was ich geschrieben habe, Ihren Stilvorlieben widerspricht. Tatsächlich würde dies beispielsweise das Projekt, an dem ich gerade arbeite, nicht weitergeben.
AJFarkas
34

ES6-Funktion für die Behandlung von Hex mit 6 Zeichen mit oder ohne '#':

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

Verwendung:

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)
Hummerkämpfer
quelle
Da toStringbei ArrayVerknüpfungen mit ,und die rrggbbaa hexFakteneingabe sein kann, können Sie sie in const rgb = hex.match (...). Slice (0,3) .map (...) returnn` $ {rgb}, $ {alpha ändern } `;
Morteza Tourani
1
Der folgende Code konvertiert auch hex2rgba ('# 369', 0.5). var hex2rgba = (hex, alpha = 1) => {const [r, g, b] = hex.match (hex.Länge <= 4? / \ w / g: / \ w \ w / g) .map ( x => parseInt (x.Länge <2 ? ${x}${x}: x, 16)); zurück rgba(${r},${g},${b},${alpha}); };
Serkan KONAKCI
16

Saubere TypeScript-Version:

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

Basierend auf der Antwort von @ AJFarkas.

Chrillewoodz
quelle
1
Dies funktioniert nicht immer, wenn in einigen Fällen NaN für r, g oder / und b zurückgegeben wird.
Renascent
Für mich geklappt! Thx
Saxophonist
Sollte das Sonst nicht zurückkehren, rgb(${r}, ${g}, ${b})da es kein Alpha hat?
Amanshu Kataria
@AmanshuKataria Ja, das sollte es. Gute Stelle.
Chrillewoodz
10

Jeder modulare Ansatz in Hex-Form

Die größte Herausforderung besteht darin, dass es ab 2018 einige Formen von HEX gibt. Die traditionelle 6-Zeichen-Form, die 3-Zeichen-Kurzform und eine neue 4- und 8-Zeichen-Form, die Alpha enthält. Die folgende Funktion kann jedes HEX-Formular verarbeiten.

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 kann der Funktion auf folgende Weise bereitgestellt werden:

  1. Als Teil einer 4 oder 8 Form HEX.
  2. Als zweiter Parameter zwischen 0-1,

Ausgabe

    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
quelle
1
Einige Browser unterstützen Hex-Farben mit Deckkraft, andere nicht. Diese Antwort war sehr nützlich bei der Konvertierung von 8-Form-Hex in rgba, wobei rgba in allen Browsern unterstützt wird.
George
1
@ George, danke! Nachdem ich dies erstellt hatte, fragte ich mich, ob ein so umfassender Ansatz tatsächlich notwendig ist. Ihr Feedback ist wertvoll.
Ben Carp
1
Ich denke, es könnte 1 winzigen Fehler in der Alpha-Berechnung geben. Ich denke, es sollte lauten: a / 255 zurückgeben, sonst gibt FF nicht zurück 1
Dustin Kerstein
@DustinKerstein schöner Fang! Kann wahrscheinlich keinen Schaden anrichten, sollte aber trotzdem behoben werden.
Ben Carp
1
Dies ist die beste Antwort und hat bei allen Unit-Tests funktioniert.
Menai Ala Eddine - Aladdin
8

Hier ist eine Funktion, die rgb oder rgba zurückgibt, wenn Sie ein Alpha angeben. Die Funktion konvertiert auch kurze hexadezimale Farbcodes.

Funktion:

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

Beispiele:

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

ES6 modern, RegEx-frei, Lösung mit Fehlerprüfung und konstanter Pfeilfunktion, die für Fehler null zurückgibt. Wenn kein Alpha angegeben wird, wird der Standardwert Eins verwendet:

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

Hinweis: Es wird nullfür Fehler zurückgegeben. Sie können durch {return null;}eine throw-Anweisung ersetzen : {throw "Not a valid hex color!";}, aber dann sollten Sie sie von innen aufrufen try-catch:

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

Reine JS-Lösung, wenn sie hilft:

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" ist "true" oder "false", je nachdem, ob Sie das Alpha möchten oder nicht.

Vorschau

ElDoRado1239
quelle
Das elseSchlüsselwort ist in diesem Fall nicht erforderlich. Das Nicht-Alpha wird trotzdem zurückgegeben.
Andy
Oh ja, aber das scheint mir "ordentlicher" zu sein. Nur eine Frage der persönlichen Präferenz, denke ich.
ElDoRado1239
Dieser Code funktioniert nicht mit Kleinbuchstaben (z. B. #f0a16e). Ich schlage vor, zuerst hexmit zu konvertieren toUpperCase.
philippe_b
3

Ich mochte die Antwort von @AJFarkas und fügte die Unterstützung für Shortcut Hex (#fff) hinzu

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

Hier ist eine ES2015 + -Version, die etwas defensiver ist und die dreistellige Kurzsyntax verarbeitet.

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

Und noch eine, die auf Bitverschiebung basiert.

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

Versuchen

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

Hier ist eine Schnellfunktion, die Farbcodes mit 3, 4, 6 und 8 Zeichen unterstützt:

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

Hier ist was es tut. Es werden alle nicht hexadezimalen Zeichen entfernt. Wenn der HEX kürzer als 5 (3 oder 4) Zeichen ist, wird jedes Zeichen verdoppelt. Anschließend wird der HEX in Paare von zwei Zeichen aufgeteilt und jedes Paar in eine Ganzzahl analysiert. Wenn es ein Alpha-HEX gibt, wird es auf einen Gleitkommawert von 0 bis 1 analysiert, andernfalls wird es standardmäßig auf 1 gesetzt. Die RGBA-Zeichenfolge wird dann durch Verbinden des Arrays gebildet und zurückgegeben.

Jacques Marais
quelle
0

Konvertieren Sie HEX mit 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+')';
}

Probieren Sie es selbst mit Snippet:

Ursprünglicher Autor

fdrv
quelle
0

Hinzufügen zu @ ElDoRado1239

Für diejenigen, die einen Alpha-Wert übergeben möchten (Typoskript-Snippet):

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})`;
  }
Löwe
quelle
-9

Versuche dies

<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
quelle
Woher kommen die hexund rgbaFunktionen?
Andy