Konwertuj Hex na RGBA

86

Moje skrzypce - http://jsbin.com/pitu/1/edit

Chciałem wypróbować łatwą konwersję hex na rgba. Kiedykolwiek przeglądarka, której używałem, renderuje kolory przy użyciu rgb jako domyślnego, więc kiedy używam próbnika kolorów farbtastic, konwertuję wartość szesnastkową na rgb, chwytając kolor tła generowany przez wartość szesnastkową (domyślnie rgb = prosta konwersja)

Próbowałem zamienić )symbol na , 1), ale to nie zadziałało, więc poszedłem zobaczyć, jak będzie działać konwersja rgb na rgba, i nadal mam problemy.

Plik jQuery

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

Cel
wprowadź opis obrazu tutaj

EDYCJA :

TinyColor to świetna biblioteka js do manipulacji kolorami, która robi wszystko, czego chcę, i nie tylko. Myślę, że możecie spróbować! - https://github.com/bgrins/TinyColor

Michael Schwartz
źródło
1
TinyColor to świetna biblioteka js do manipulacji kolorami, która robi wszystko, czego chcę, i nie tylko. Myślę, że możecie spróbować!
Michael Schwartz

Odpowiedzi:

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
źródło
1
Dziękuję ..
Zadziałało
4
bardzo łatwe do zrozumienia rozwiązanie, ale nie obsługuje 8 form hex jak #ff0000aa?
supersan
1
To nie działa, jeśli dane wejściowe nie mają dokładnie 3 lub 6 znaków.
Kehlan Krumme
93

@ ElDoRado1239 ma dobry pomysł, ale jest też czystszy sposób:

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
źródło
1
Uwaga: to się nie powiedzie w przypadku skrótów HEX, np #fff. Jednak powinno to być łatwe do naprawienia!
Matthew Herbst,
1
Cóż, tak, musisz nadać funkcji prawidłowe dane wejściowe…
AJFarkas
Bardzo czytelny, podoba mi się znacznie bardziej niż rozwiązanie oparte na reg expach.
dahrens
Dobra robota!! Muszę jednak wspomnieć o małej rzeczy. Mam złe doświadczenia z utrzymywaniem spacji między przecinkiem a wartościami RGBA w ciągu. (np .: rgba (255, 35, 234, 0,5)). Zwłaszcza jeśli przekazujesz tę wartość do innego programu, miej tego świadomość. Ponieważ istnieją programy, które nie akceptują spacji między wartościami w ciągu. Więc lepiej usunąć te spacje z końcowego wyniku.
Tharanga
eslintto tylko egzekwowanie stylu. To tylko przypadek, że nic, co napisałem, nie jest sprzeczne z Twoimi preferencjami dotyczącymi stylu. W rzeczywistości nie przejdzie to na przykład na projekt, nad którym obecnie pracuję.
AJFarkas
33

Funkcja ES6 do obsługi tylko 6 znaków szesnastkowych z lub bez znaku „#”:

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

Stosowanie:

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
źródło
Ponieważ toStringprzy Arraysprzężeniach z ,i wprowadzaniu faktów rrggbbaa hexmożna zmienić to na const rgb = hex.match (...). Slice (0,3) .map (...) returnn` $ {rgb}, $ {alpha } `;
Morteza Tourani
1
poniższy kod również skonwertuje 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)); powrót rgba(${r},${g},${b},${alpha}); };
Serkan KONAKCI
14

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

Na podstawie odpowiedzi @ AJFarkas.

Chrillewoodz
źródło
1
To nie działa za każdym razem, w niektórych przypadkach zwraca NaN dla r, g lub / i b.
Renascent
U mnie wyszło! Thx
Saxophonist
10

Dowolne podejście modułowe Hex Form

Głównym wyzwaniem jest to, że od 2018 roku istnieje kilka form HEX. Forma tradycyjna z 6 znakami, forma skrócona z 3 znakami oraz nowa forma z 4 i 8 znakami zawierająca alfę. Następująca funkcja może obsługiwać dowolną postać 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)})`
}

Alfę można dostarczyć do funkcji w następujący sposób:

  1. Jako część 4 lub 8 HEX.
  2. Jako drugi parametr między 0-1,

Wynik

    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
źródło
1
Niektóre przeglądarki obsługują kolory szesnastkowe z kryciem, inne nie. Ta odpowiedź była bardzo przydatna przy konwersji 8 form hex na rgba, przy czym rgba jest obsługiwany we wszystkich przeglądarkach.
George
1
@George, dzięki! Po stworzeniu tego zadałem sobie pytanie, czy takie kompleksowe podejście jest rzeczywiście konieczne. Twoja opinia jest cenna.
Ben Carp
1
Myślę, że w kalkulacji alfa może być 1 mały błąd. Myślę, że powinno to brzmieć: zwraca a / 255, w przeciwnym razie FF nie zwraca 1
Dustin Kerstein
@DustinKerstein niezły chwyt! Prawdopodobnie nie może wyrządzić szkody, ale nadal należy to naprawić.
Ben Carp
1
To najlepsza odpowiedź i zadziałała w przypadku wszystkich testów jednostkowych.
Menai Ala Eddine - Aladdin
9

Jeśli chcesz przekonwertować hex na rgba, możesz użyć tej funkcji,

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

Oto szczegóły w postaci szesnastkowej do rgba

Sajjad Hossain
źródło
8

Oto funkcja, która zwraca rgb lub rgba, jeśli podasz alfa. Funkcja konwertuje również krótkie szesnastkowe kody kolorów.

funkcjonować:

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

przykłady:

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
źródło
6

ES6 nowoczesne, wolne od RegEx rozwiązanie ze sprawdzaniem błędów i stałą funkcją strzałki, która zwraca wartość null dla błędów. Jeśli alfa nie jest podana, używana jest domyślna wartość jeden:

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

Uwaga: zwraca nullpo błędach. Możesz zamienić {return null;}na instrukcję throw: {throw "Not a valid hex color!";}ale wtedy powinieneś wywołać ją od wewnątrz try-catch:

hexToRGB("#3454r5") => null
hexToRGB("#345465") => rgba(52, 84, 101, 1)
hexToRGB("#345465", 0.5) => rgba(52, 84, 101, 0.5)
Sverrisson
źródło
5

Czyste rozwiązanie JS, jeśli pomaga:

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” jest „true” lub „false” w zależności od tego, czy chcesz, czy nie chcesz, alfa.

Zapowiedź

ElDoRado1239
źródło
W elsetym przypadku słowo kluczowe jest niepotrzebne. Niezależnie od tego zwróci wartość inną niż alfa.
Andy,
Och, tak, ale to wydaje mi się bardziej „uporządkowane”. Chyba tylko kwestia osobistych preferencji.
ElDoRado1239
Ten kod nie działa z małymi literami szesnastkowymi (np. #f0a16e). Proponuję, aby przekształcić hexsię toUpperCasew pierwszej kolejności.
philippe_b
3

Podobała mi się odpowiedź @AJFarkas i dodałem do niej obsługę skrótu szesnastkowego (#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
źródło
3

Oto wersja ES2015 +, która jest nieco bardziej defensywna i obsługuje skróconą 3-cyfrową składnię.

/*
 * 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
źródło
1

I kolejny oparty na przesunięciu bitów.

// 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
źródło
1

Próbować

// 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
źródło
0

Konwertuj HEX z alfą (ahex) na 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+')';
}

Wypróbuj sam z fragmentem:

Oryginalny autor

fdrv
źródło
0

Dodawanie do @ ElDoRado1239

Dla tych, którzy chcą przekazać wartość alfa (fragment maszynopisu):

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})`;
  }
Lew
źródło
-9

Spróbuj tego

<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
źródło
Skąd pochodzą funkcje hexi rgba?
Andy,