RGB değeri yerine onaltılık renk değeri nasıl alınır?


171

Aşağıdaki jQuery kullanıldığında, öğenin arka plan renginin RGB değeri elde edilir:

$('#selector').css('backgroundColor');

RGB yerine onaltılık değeri almanın bir yolu var mı?


2
İlgili bir konuda, onaltılık ve RGB renkleri arasında dönüştürme yapmak için daha fazla (ve muhtemelen daha iyi) yollar burada: stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb Bu tekerlek yeterince kez yeniden icat edildi bir tren inşa etmek. Popüler JS kütüphanelerinden birinin, daha azdan daha basit, bir yardımcı fonksiyona sahip olmasını umuyordum.
Michael Scheper

Bazı tarayıcıların siyah değil saydam olan rgba (0,0,0,0) gibi rgba (#, #, #, #) döndürdüğünü unutmayın. 4. değer opaklıktır, 1.0 tam renkli% 100 ve 0.5% 50'dir.
12

Yanıtlar:


141
var hexDigits = new Array
        ("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"); 

//Function to convert rgb color to hex format
function rgb2hex(rgb) {
 rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
 return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
}

function hex(x) {
  return isNaN(x) ? "00" : hexDigits[(x - x % 16) / 16] + hexDigits[x % 16];
 }

( Kaynak )


7
+1, Number.toString (16) öğesini kullanabilirsiniz - en azından her onaltılı basamak için (veya 16'nın altındaysa 0 ile yastık)
8'de orip

19
-1. Orip tarafından belirtildiği gibi toString (16) kullanabilirsiniz. Diğer verimsizlikler için düşürüldü. Her işlev çağrısında hexDigits bildirecekseniz, en azından rgb2hex işlev gövdesinde (hex'in gövdesi değil) yapın, böylece dizi rgb2hex'e yapılan her 1 çağrıda 3 kez yeniden tanımlanmaz. Ayrıca 'var' kullanmayı öğrenin, böylece küresel kapsamı kirletmezsiniz.
Matt

3
Bu yöntem, farklı beyaz boşluklara veya büyük harf kullanımına toleranslı görünmüyor. jsfiddle.net/Xotic750/pSQ7d
Xotic750

1
Gerçekten bilgiçlikçi olmak istiyorsanız, normal ifadeyi daha izin verici yapabilirsiniz: rgb.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i)Bununla birlikte, verilen normal ifade, jQuery kullanırken bir tarayıcı tarafından verilen biçim ile başa çıkmak üzere tasarlanmıştır ve bu, farklı beyaz boşluk veya captilisation tutarlılıklarına sahip değildir. HAKKINDA konusuyorsun. Aynı regex'i kullanabilir ve tüm beyaz alanları kaldırabilir ve rgb ile eşleştirmeden önce küçük harfe dönüştürebilirsiniz. PS Keman örneğiniz: 'rgb (10, 128,)' Bunun test edilmesi makul olduğunu düşünmüyorum
binderbound

ve benim için jquery css arka plan renklerinin dönüşü rgba formatında geliyor, bu yüzden bu çalışmıyor.
Miguel

159

@Matt önerisine göre yazdığım daha temiz çözüm:

function rgb2hex(rgb) {
    rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
    function hex(x) {
        return ("0" + parseInt(x).toString(16)).slice(-2);
    }
    return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
}

Bazı tarayıcılar renkleri onaltılık olarak döndürür (Internet Explorer 8 ve sonraki sürümlerden itibaren). Bu durumlarla ilgilenmeniz gerekiyorsa, işlevin içine @gfrobenius'un önerdiği gibi bir koşul ekleyin:

function rgb2hex(rgb) {
    if (/^#[0-9A-F]{6}$/i.test(rgb)) return rgb;

    rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
    function hex(x) {
        return ("0" + parseInt(x).toString(16)).slice(-2);
    }
    return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
}

JQuery kullanıyorsanız ve daha eksiksiz bir yaklaşım istiyorsanız, bu soruyu yanıtlarken gösterdiğim gibi jQuery 1.4.3'ten beri mevcut olan CSS Kancalarını kullanabilirsiniz: jQuery.css ("backgroundColor") onaltılık biçimde döndürülmesini zorlayabilir miyim?


2
Herkese öneririm: jQuery CSS Kancalarını kullanarak gelişmiş bir sürüm görmek için buradaki yanıma bir göz atın .
Erick Petrucelli

1
@Ghigo, üzgünüm ama yanılıyorsun. Bu şekilde cari tarzı alırken IE8 zaten onaltılık olarak renkleri döndürür: document.getElementById("your_id").currentStyle["backgroundColor"]. İşlev rgb2hex()gerekli değildir. Yukarıda önerdiğim CSS Kancalarını kullanan jQuery eklentisi, zaten farklı tarayıcılarda renkleri kurtarmak için tüm doğrulamaları zaten yapıyor: stackoverflow.com/questions/6177454/…
Erick Petrucelli

2
@Ghigo, yanlış anladığınızı düşünüyorum: HEX'e dönen bir tarayıcıdaysanız bu işlevi KULLANMAMALISINIZ. Bu işlev RGB'yi HEX'e ve sadece dönüştürür. RGB'de değilken kullanmayın. Daha eksiksiz bir çözüme ihtiyacınız olması (@ Jim-F tarafından yapılan değerin RGB olarak olup olmadığını algılar), bu çözümün OP tarafından talep edileni tam olarak sunduğu gerçeğini değiştirmez. Downvot'unuz hiç mantıklı değil, üzgünüm.
Erick Petrucelli

4
Üzgünüm ama aynı fikirde değilim. Çapraz tarayıcı işlevi her zaman tarayıcı algılamaya göre yürütülmesi gereken bir işlevden daha iyidir. Op $('#selector').css('backgroundColor'), bir rgb değerini hex'e değil, hex'e dönüştürmeyi istedi . Ve IE8'de, $('#selector').css('backgroundColor')zaten hex olduğundan ele alınmalıdır. Bu kadar. Bana kızma :)
Ghigo

1
Bunu yap, basit bir astarı rgb2hex()fonksiyona ekledim , teşekkürler @ErickPetru! Ben inan ya da inan IE7 geri kodlamak zorunda. Ile .css('backgroundColor')ve yerli obj.style.backgroundColorIE7 & 8 RGB değil hex döndürür, bu yüzden rgb2hex()verilen cevap işlevinde ilk satır olarak bunu ekledi böylece IE7 için sonuna kadar çalışır: /* IE7&8 will return hex, so no need to run this function if it is already hex. */ if (/^#[0-9A-F]{6}$/i.test(rgb)) return rgb.substring(1, 7); //I'm doing a subtring here because I do not want the leading # symbolUmut yardımcı olur.
gfrobenius

61

Çoğu tarayıcı kullanırken RGB değerini döndürüyor gibi görünüyor:

$('#selector').css('backgroundColor');

Yalnızca IE (şu ana kadar test edilen yalnızca 6 adet) Hex değerini döndürür.

IE'de hata iletilerinden kaçınmak için, işlevi bir if ifadesinde kapatabilirsiniz:

function rgb2hex(rgb) {
     if (  rgb.search("rgb") == -1 ) {
          return rgb;
     } else {
          rgb = rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+))?\)$/);
          function hex(x) {
               return ("0" + parseInt(x).toString(16)).slice(-2);
          }
          return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]); 
     }
}

1
Jim, rgba'yı dikkate aldığından, Safari'nin (en azından Mac OS X'te) kullandığı şey, diğerlerinden daha iyi çalışır. Teşekkürler Jim!
Pascal Lindelauf

1
Harika bir çözüm. İşlevin küçük harflerle döndüğünü unutmayın; örn. # FF5544 değil # ff5544.
Peter

Bu normal ifade, yukarıdaki çözümde aplha kanallarını da destekleyecektir. Rgb = rgb.match (/ ^ rgba? ((\ D +), \ s * (\ d +), \ s * (\ d +) (?:, \ S * (0 \ \ d +.))) $ /);
Henning Winter

work like a charm
ucmedia

22

Rgba uyumluluğu için @ErickPetru güncellendi:

function rgb2hex(rgb) {
    rgb = rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+))?\)$/);
    function hex(x) {
        return ("0" + parseInt(x).toString(16)).slice(-2);
    }
    return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
}

Normal ifadeyi, tanımlanmışsa alfa değeriyle eşleşecek şekilde güncelledim, ancak kullanmıyorum.


Sadece tamlık için: PowerPoint'e (sorma ...) ihracat yapacak bir şey üzerinde çalışıyorum ve alfa kanalı için hex dizesinde dördüncü bir bayt kabul ediyor, bu yüzden bu şekilde kullanabilirsiniz: return hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]) /* Add the alpha channel if it exists */ + (rgb[5] !== undefined ? hex(Math.round(rgb[5] * 255)) : ''); Ayrıca #, son kullanımdan agnostik hale getirmek için sembolü kaldırıyorum (biri çıktıyı alıp başa ekleyebilir 0xveya önek olmadan bırakabilir). Umarım birine yardım eder!
Gómezscar Gómez Alcañiz

10

İşte jQuery kullanmayan bir ES6 tek astar:

var rgb = document.querySelector('#selector').style['background-color'];
return '#' + rgb.substr(4, rgb.indexOf(')') - 4).split(',').map((color) => parseInt(color).toString(16)).join('');

1
Teşekkürler, bu, önceki yanıtlarda normal ifade ters eğik çizgilerini çıkaran bir Wordpress sayfasına eklememe yardımcı oldu.
Jason

5

İşte aynı zamanda saydamlığı kontrol eden bir versiyon, nesneyi onaltılık bir rengin saydam versiyonunun aslında "saydam" kelimesi olduğu bir stil niteliğine eklemek olduğu için buna ihtiyacım vardı.

function rgb2hex(rgb) {
     if (  rgb.search("rgb") == -1 ) {
          return rgb;
     }
     else if ( rgb == 'rgba(0, 0, 0, 0)' ) {
         return 'transparent';
     }
     else {
          rgb = rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+))?\)$/);
          function hex(x) {
               return ("0" + parseInt(x).toString(16)).slice(-2);
          }
          return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]); 
     }
}

4

Onaltılık bir öğenin arka plan rengini döndüren işlev.

function getBgColorHex(elem){
    var color = elem.css('background-color')
    var hex;
    if(color.indexOf('#')>-1){
        //for IE
        hex = color;
    } else {
        var rgb = color.match(/\d+/g);
        hex = '#'+ ('0' + parseInt(rgb[0], 10).toString(16)).slice(-2) + ('0' + parseInt(rgb[1], 10).toString(16)).slice(-2) + ('0' + parseInt(rgb[2], 10).toString(16)).slice(-2);
    }
    return hex;
}

kullanım örneği:

$('#div1').click(function(){
   alert(getBgColorHex($(this));
}

jsfiddle


4

@Jim F yanıtıyla aynı cevap ama ES6 sözdizimi, bu yüzden daha az talimat:

const rgb2hex = (rgb) => {
  if (rgb.search("rgb") === -1) return rgb;
  rgb = rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+))?\)$/);
  const hex = (x) => ("0" + parseInt(x).toString(16)).slice(-2);
  return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
};

3

Bootstrap renk seçiciden alınan renk sınıfı

// Color object
var Color = function(val) {
    this.value = {
        h: 1,
        s: 1,
        b: 1,
        a: 1
    };
    this.setColor(val);
};

Color.prototype = {
    constructor: Color,

    //parse a string to HSB
    setColor: function(val){
        val = val.toLowerCase();
        var that = this;
        $.each( CPGlobal.stringParsers, function( i, parser ) {
            var match = parser.re.exec( val ),
            values = match && parser.parse( match ),
            space = parser.space||'rgba';
            if ( values ) {
                if (space === 'hsla') {
                    that.value = CPGlobal.RGBtoHSB.apply(null, CPGlobal.HSLtoRGB.apply(null, values));
                } else {
                    that.value = CPGlobal.RGBtoHSB.apply(null, values);
                }
                return false;
            }
        });
    },

    setHue: function(h) {
        this.value.h = 1- h;
    },

    setSaturation: function(s) {
        this.value.s = s;
    },

    setLightness: function(b) {
        this.value.b = 1- b;
    },

    setAlpha: function(a) {
        this.value.a = parseInt((1 - a)*100, 10)/100;
    },

    // HSBtoRGB from RaphaelJS
    // https://github.com/DmitryBaranovskiy/raphael/
    toRGB: function(h, s, b, a) {
        if (!h) {
            h = this.value.h;
            s = this.value.s;
            b = this.value.b;
        }
        h *= 360;
        var R, G, B, X, C;
        h = (h % 360) / 60;
        C = b * s;
        X = C * (1 - Math.abs(h % 2 - 1));
        R = G = B = b - C;

        h = ~~h;
        R += [C, X, 0, 0, X, C][h];
        G += [X, C, C, X, 0, 0][h];
        B += [0, 0, X, C, C, X][h];
        return {
            r: Math.round(R*255),
            g: Math.round(G*255),
            b: Math.round(B*255),
            a: a||this.value.a
        };
    },

    toHex: function(h, s, b, a){
        var rgb = this.toRGB(h, s, b, a);
        return '#'+((1 << 24) | (parseInt(rgb.r) << 16) | (parseInt(rgb.g) << 8) | parseInt(rgb.b)).toString(16).substr(1);
    },

    toHSL: function(h, s, b, a){
        if (!h) {
            h = this.value.h;
            s = this.value.s;
            b = this.value.b;
        }
        var H = h,
        L = (2 - s) * b,
        S = s * b;
        if (L > 0 && L <= 1) {
            S /= L;
        } else {
            S /= 2 - L;
        }
        L /= 2;
        if (S > 1) {
            S = 1;
        }
        return {
            h: H,
            s: S,
            l: L,
            a: a||this.value.a
        };
    }
};

nasıl kullanılır

var color = new Color("RGB(0,5,5)");
color.toHex()

3

Okunabilir & Reg-exp ücretsiz (Reg-exp yok)

Okunabilir temel fonksiyonları ve reg-exps kullanan bir fonksiyon yarattım.
İşlev, onaltılık, rgb veya rgba CSS biçimindeki renkleri kabul eder ve onaltılık temsili döndürür.
EDIT: rgba () biçimini ayrıştırmada bir hata oluştu, düzeltildi ...

function getHexColor( color ){
    //if color is already in hex, just return it...
    if( color.indexOf('#') != -1 ) return color;
    
    //leave only "R,G,B" :
    color = color
                .replace("rgba", "") //must go BEFORE rgb replace
                .replace("rgb", "")
                .replace("(", "")
                .replace(")", "");
    color = color.split(","); // get Array["R","G","B"]
    
    // 0) add leading #
    // 1) add leading zero, so we get 0XY or 0X
    // 2) append leading zero with parsed out int value of R/G/B
    //    converted to HEX string representation
    // 3) slice out 2 last chars (get last 2 chars) => 
    //    => we get XY from 0XY and 0X stays the same
    return  "#"
            + ( '0' + parseInt(color[0], 10).toString(16) ).slice(-2)
            + ( '0' + parseInt(color[1], 10).toString(16) ).slice(-2)
            + ( '0' + parseInt(color[2], 10).toString(16) ).slice(-2);
}

1
Rgba (0,0,0,0) üzerinde çalışmaz. İlk olarak, siparişin değişmesi gerekir .replace("rgba", "") .replace("rgb", "") .replace("(", "") .replace(")", "");Aksi takdirde, 0,0,0,0 ile ayrılırsınız. Saydam yerine Siyah olan # 000000 değerini döndürür.
12

Bir rgba'daki 4. değer 0 (sıfır) ise, o 'öğe' için css için şöyle olur: öğe {renk: # 000000, opaklık: 0.0;} saydam veya yalnızca koşullu olarak 'rgba (0,0 , 0,0) 'arayana geri döner.
12

@ Twelve24 Ayrıştırma düzeltildi - Aslında yorumunuzu okumadan önce fark ettim, ama kesinlikle bunun için teşekkürler :), Şeffaflık gelince - fonksiyonun HEXA rengini veya "temel rengi" döndürmesi gerekiyor - böylece bir amaca yönelik :)
jave.web

3

Deneyin

// c - color str e.g."rgb(12,233,43)", result color hex e.g. "#0ce92b"
let rgb2hex= c=> '#'+c.match(/\d+/g).map(x=>(+x).toString(16).padStart(2,0)).join``


2

Bu biraz daha hoş görünüyor:

var rgb = $('#selector').css('backgroundColor').match(/\d+/g);
var r   = parseInt(rgb[0], 10);
var g   = parseInt(rgb[1], 10);
var b   = parseInt(rgb[2], 10);
var hex = '#'+ r.toString(16) + g.toString(16) + b.toString(16);

daha özlü bir astar:

var rgb = $('#selector').css('backgroundColor').match(/\d+/g);
var hex = '#'+ Number(rgb[0]).toString(16) + Number(rgb[1]).toString(16) + Number(rgb[2]).toString(16);

jQuery'yi her zaman hex döndürmeye zorlama:

$.cssHooks.backgroundColor = {
    get: function(elem) {
        if (elem.currentStyle)
            var bg = elem.currentStyle["backgroundColor"];
        else if (window.getComputedStyle) {
            var bg = document.defaultView.getComputedStyle(elem,
                null).getPropertyValue("background-color");
        }
        if (bg.search("rgb") == -1) {
            return bg;
        } else {
            bg = bg.match(/\d+/g);
            function hex(x) {
                return ("0" + parseInt(x).toString(16)).slice(-2);
            }
            return "#" + hex(bg[0]) + hex(bg[1]) + hex(bg[2]);
        }
    }
}

2

Yukarıdaki @ Justin'in cevabına eklemek için ..

olmalı

var rgb = document.querySelector('#selector').style['background-color'];
return '#' + rgb.substr(4, rgb.indexOf(')') - 4).split(',').map((color) => String("0" + parseInt(color).toString(16)).slice(-2)).join('');

Yukarıdaki ayrıştırma int işlevleri önde gelen sıfırları kısalttığından, 5 veya 4 harflik yanlış renk kodları üretebilir ... yani rgb (216, 160, 10) için # d8a0a olması gerekirken # d8a00a üretir.

Teşekkürler



1

Steven Pribilinskiy'nin cevabı önde gelen sıfırları düşürüyor, örneğin # ff0000 # ff00 oluyor.

Bir çözüm, önde gelen 0 ve son 2 basamaktan alt dize eklemektir.

var rgb = $('#selector').css('backgroundColor').match(/\d+/g);
var hex = '#'+ String('0' + Number(rgb[0]).toString(16)).slice(-2) + String('0' + Number(rgb[1]).toString(16)).slice(-2) + String('0' + Number(rgb[2]).toString(16)).slice(-2);

1

Soru JQuery kullandığından, Daniel Elliott koduna dayanan bir JQuery eklentisi:

$.fn.cssAsHex = function(colorProp) {

    var hexDigits = '0123456789abcdef';

    function hex(x) {
        return isNaN(x) ? '00' : hexDigits[(x - x % 16) / 16] + hexDigits[x % 16];
    };

    // Convert RGB color to Hex format
    function rgb2hex(rgb) {
        var rgbRegex = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
        return '#' + hex(rgbRegex[1]) + hex(rgbRegex[2]) + hex(rgbRegex[3]);
    };

    return rgb2hex(this.css(colorProp));
};

Gibi kullanın:

var hexBackgroundColor = $('#myElement').cssAsHex('background-color');

0

Burada da yok benim çözümdür toUpperCase sağlanan dizede diğer olası beyaz boşluklar ve büyük harf için bir argüman ve çeklerin kullanımıyla.

var a = "rgb(10, 128, 255)";
var b = "rgb( 10, 128, 255)";
var c = "rgb(10, 128, 255 )";
var d = "rgb ( 10, 128, 255 )";
var e = "RGB ( 10, 128, 255 )";
var f = "rgb(10,128,255)";
var g = "rgb(10, 128,)";

var rgbToHex = (function () {
    var rx = /^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i;

    function pad(num) {
        if (num.length === 1) {
            num = "0" + num;
        }

        return num;
    }

    return function (rgb, uppercase) {
        var rxArray = rgb.match(rx),
            hex;

        if (rxArray !== null) {
            hex = pad(parseInt(rxArray[1], 10).toString(16)) + pad(parseInt(rxArray[2], 10).toString(16)) + pad(parseInt(rxArray[3], 10).toString(16));

            if (uppercase === true) {
                hex = hex.toUpperCase();
            }

            return hex;
        }

        return;
    };
}());

console.log(rgbToHex(a));
console.log(rgbToHex(b, true));
console.log(rgbToHex(c));
console.log(rgbToHex(d));
console.log(rgbToHex(e));
console.log(rgbToHex(f));
console.log(rgbToHex(g));

Açık jsfiddle

Jsperf'de hız karşılaştırması

Bir başka gelişme bağlı olabilir dizetrim()rgb

var rxArray = rgb.trim().match(rx),

0

Güzel standart dışı çözümüm

HTML

<div id="selector" style="background-color:#f5b405"></div>

jQuery

$("#selector").attr("style").replace("background-color:", "");

Sonuç

#f5b405

1
Tarzdaki her şeyi döndürür. : c
Eddie
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.