Hex'i RGBA'ya Dönüştür


86

Kemanım - http://jsbin.com/pitu/1/edit

Kolay bir hex-rgba dönüşümü denemek istedim. Kullandığım her tarayıcı, renkleri varsayılan olarak rgb kullanarak işler, bu nedenle farbtastic renk seçiciyi kullanırken, onaltılık değerin ürettiği arka plan rengini alarak onaltılık değeri rgb'ye dönüştürüyorum (varsayılan olarak rgb olarak = basit dönüşüm)

)Sembolü olarak değiştirmeyi denedim , 1), ancak bu işe yaramadı, bu yüzden sadece rgb'yi rgba'ya dönüştürmenin nasıl çalışacağını görmeye gittim ve hala sorun yaşıyorum.

Jquery

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

Amaç
görüntü açıklamasını buraya girin

DÜZENLE :

TinyColor Burada istediğim her şeyi ve daha fazlasını yapan harika bir renk işleme js kitaplığıdır. Denemek isteyebileceğinizi düşündüm! - https://github.com/bgrins/TinyColor


1
TinyColor Burada istediğim her şeyi ve daha fazlasını yapan harika bir renk işleme js kitaplığıdır. Denemek isteyebileceğinizi düşündüm!
Michael Schwartz

Yanıtlar:


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
Teşekkürler .. Mucize gibi çalıştı .. :)
Manprit Singh Sahota

4
Çözümü anlamak çok kolay ama 8 form hex gibi desteklemiyor #ff0000aa?
supersan

1
Giriş tam olarak 3 veya 6 karakter değilse bu işe yaramaz.
Kehlan Krumme

97

@ ElDoRado1239 doğru fikre sahip, ancak daha temiz bir yolu da var:

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
Not: Bu, HEX kısayollarında başarısız olur, örn #fff. Yine de kolayca düzeltilebilir olmalı!
Matthew Herbst

1
Evet, işleve doğru girişi
vermelisiniz

Çok okunabilir, bunu reg exp tabanlı çözümden çok daha fazla seviyorum.
dahrens

İyi iş!! Yine de bahsetmem gereken küçük bir şey. Dizede virgül ve RGBA değerleri arasında boşluk bırakma konusunda bazı kötü deneyimlerim var. (örneğin: rgba (255, 35, 234, 0.5)). Özellikle bu değeri başka bir programa aktarırsanız, bunun farkında olun. Çünkü dizedeki değerler arasındaki boşlukları kabul etmeyen bazı programlar var. Bu nedenle, bu boşlukları son çıktıdan çıkarmak daha iyidir.
Tharanga

eslintsadece stil uygulamasıdır. Yazdığım hiçbir şeyin stil tercihlerinizle çelişmemesi şans eseri. Aslında bu, örneğin şu anda üzerinde çalıştığım projeye ışık tutmaz.
AJFarkas

34

Yalnızca 6 karakter onaltılık '#' ile veya "#" olmadan işlemek için ES6 işlevi:

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

Kullanım:

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)

Yana toStringüzerinde Arraybirleştiği ,ve aslında girilebilir rrggbbaa hexsen (...) const rgb = hex.match olarak değiştirebilirsiniz. Dilim (0,3) .map (...) returnn` $ {rgb} $ {alfa } ';
Morteza Tourani

1
Aşağıdaki kod hex2rgba ('# 369', 0.5) 'i de dönüştürür; 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)); dönüş rgba(${r},${g},${b},${alpha}); };
Serkan KONAKCI

17

TypeScript sürümünü temizle:

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

@ AJFarkas'ın cevabına göre.


1
Bu, bazı durumlarda her seferinde çalışmaz, r, g veya / ve b için NaN döndürür.
Renascent

Benim için çalıştı! Thx
Saksafoncu

rgb(${r}, ${g}, ${b})Alfa olmayacağı için diğerinin geri dönmemesi gerekir mi?
Amanshu Kataria

@AmanshuKataria Evet olmalı. İyi nokta.
Chrillewoodz

10

Herhangi Bir Hex Form Modüler Yaklaşım

Asıl zorluk, 2018 itibariyle birkaç HEX formunun olmasıdır. 6 karakterli geleneksel form, 3 karakter kısaltılmış form ve alfa içeren yeni bir 4 ve 8 karakter formu. Aşağıdaki işlev herhangi bir HEX formunu işleyebilir.

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

Alfa, işleve aşağıdaki şekillerde sağlanabilir:

  1. 4 veya 8 form HEX'in bir parçası olarak.
  2. 0-1 arasında ikinci bir parametre olarak,

Çıktı

    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
Bazı tarayıcılar, opaklığa sahip Hex renkleri desteklerken, diğerleri desteklemez. Bu yanıt, 8 form hex'i rgba'ya dönüştürmede çok yararlı oldu, rgba tüm tarayıcılarda destekleniyor.
George

1
@George, Teşekkürler! Bunu oluşturduktan sonra kendime bu kadar kapsamlı bir yaklaşımın gerçekten gerekli olup olmadığını sordum. Görüşleriniz değerlidir.
Ben Sazan

1
Alfa hesaplamasında 1 küçük hata olabileceğini düşünüyorum. Ben okumak gerektiğini düşünüyorum: Bir dönüş / 255 Aksi FF 1 dönmez
Dustin Kerstein

@DustinKerstein güzel yakala! Muhtemelen zarar veremez, ancak yine de düzeltilmesi gerekir.
Ben Sazan

1
Bu en iyi cevap ve benim için tüm birim testlerinde işe yaradı.
Menai Ala Eddine - Aladdin

8

Alfa sağlarsanız rgb veya rgba döndüren bir işlev burada. İşlev aynı zamanda kısa onaltılık renk kodlarını da dönüştürür.

işlev:

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

örnekler:

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 modern, RegEx içermeyen, hata denetimi ve sabit ok işlevine sahip çözüm, hatalar için boş döndürür. Alfa verilmemişse, birinin varsayılan değeri kullanılır:

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

Not: nullHatalar için geri döner . {return null;}Bir throw ifadesiyle değiştirebilirsiniz :, {throw "Not a valid hex color!";}ancak sonra onu içeriden çağırmalısınız try-catch:

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

5

Yardımcı olursa saf JS çözümü:

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", alfayı isteyip istemediğinize bağlı olarak "doğru" veya "yanlış" tır.

Ön izleme


elseAnahtar kelime, bu durumda gereksizdir. Ne olursa olsun alfa olmayanı döndürecektir.
Andy

Evet, ama bu bana daha "düzenli" geliyor. Sanırım sadece kişisel bir tercih meselesi.
ElDoRado1239

Bu kod, küçük harfli onaltılık (örn. #f0a16e) İle çalışmaz . Ben dönüştürmek önermek hexile toUpperCaseilk.
philippe_b

3

@AJFarkas yanıtını beğendim ve buna hex kısayolu (#fff) desteğini ekledim

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

İşte biraz daha savunmacı ve kısa 3 basamaklı sözdizimini işleyen bir ES2015 + sürümü.

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

Ve biraz kaymaya dayalı bir diğeri.

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

Deneyin

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

İşte 3, 4, 6 ve 8 karakterlik renk kodlarını destekleyen hızlı bir işlev:

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

İşte yaptığı şey. Onaltılık olmayan tüm karakterleri kaldırır. HEX 5 (3 veya 4) karakterden kısaysa, her karakteri ikiye katlar. Daha sonra HEX'i iki karakterlik çiftlere ayırır ve her çifti bir tam sayıya ayrıştırır. Bir alfa HEX varsa, 0'dan 1'e bir kayan nokta olarak ayrıştırılır, aksi takdirde varsayılan olarak 1'dir. RGBA dizisi daha sonra diziye katılarak oluşturulur ve döndürülür.


0

HEX'i alfa (ahex) ile rgba'ya dönüştürün.

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

Snippet ile kendiniz deneyin:

Orijinal Yazar


0

@ ElDoRado1239 ekleniyor

Alfa değerini (typecript snippet) geçirmek isteyenler için:

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

Bunu dene

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

Nerede edilir hexve rgbaişlevleri gelen?
Andy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.