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


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

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


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)

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.


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)

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


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)

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)

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ź


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


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

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

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


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


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


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

Skąd pochodzą funkcje hexi rgba?
Andy,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.