Jeśli chodzi o pokrewny temat, więcej (i prawdopodobnie lepszych) sposobów konwersji między kolorami szesnastkowymi i RGB jest tutaj: stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb To koło zostało odkryte wystarczająco dużo razy zbudować pociąg drogowy. Miałem nadzieję, że jedna z popularnych bibliotek JS, prostsza niż mniejsza, będzie miała funkcję narzędziową.
Michael Scheper
Pamiętaj, że niektóre przeglądarki zwracają rgba (#, #, #, #), na przykład rgba (0,0,0,0), który jest przezroczysty, a nie czarny. Czwarta wartość to krycie, gdzie 1.0 to pełny kolor 100%, a 0.5 to 50%.
Dwanaście 24
Odpowiedzi:
141
var hexDigits =newArray("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f");//Function to convert rgb color to hex formatfunction 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];}
+1, możesz użyć Number.toString (16) - przynajmniej dla każdej cyfry szesnastkowej (lub 0, jeśli poniżej 16)
orip
19
-1. Jak wspomniał orip, możesz użyć toString (16). Negocjowany za inne nieefektywności. Jeśli zamierzasz zadeklarować hexDigits przy każdym wywołaniu funkcji, przynajmniej zrób to w treści funkcji rgb2hex (nie w treści szesnastkowej), aby tablica nie była redefiniowana 3 razy na 1 wywołanie rgb2hex. Naucz się także używać „var”, aby nie zanieczyszczać zasięgu globalnego.
Matt
3
Ta metoda nie wydaje się zbyt tolerancyjna dla różnych białych znaków lub wielkich liter. jsfiddle.net/Xotic750/pSQ7d
Xotic750
1
Jeśli naprawdę chcesz być pedantyczny, możesz uczynić regex bardziej liberalnym: rgb.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i)Jednak podane wyrażenie regularne jest zaprojektowane tak, aby poradzić sobie z formatem podanym przez przeglądarkę podczas korzystania z jQuery i nie ma różnych odstępów białych lub spójnych znaków mówisz o. Możesz również użyć tego samego wyrażenia regularnego i po prostu usunąć wszystkie białe znaki i przekonwertować je na małe litery przed dopasowaniem do rgb. PS Twój przykład skrzypiec: 'rgb (10, 128,)' Nie sądzę, aby testowanie było rozsądne
binderbound
a dla mnie powrót kolorów tła css jquery jest w formacie rgba, więc to nie działa.
Miguel
159
Oto czystsze rozwiązanie, które napisałem na podstawie sugestii @Matt:
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]);}
Niektóre przeglądarki już zwracają kolory w postaci szesnastkowej (od Internet Explorera 8 i starszych). Jeśli chcesz poradzić sobie z takimi przypadkami, po prostu dołącz warunek wewnątrz funkcji, jak zasugerował @gfrobenius:
Proponuję wszystkim: spójrz na moją odpowiedź tutaj, aby zobaczyć ulepszoną wersję wykorzystującą jQuery CSS hooki .
Erick Petrucelli
1
@Ghigo, przepraszam, ale się mylisz. IE8 już wraca kolory jak szesnastkowym gdy uzyskanie aktualnego stylu, w ten sposób: document.getElementById("your_id").currentStyle["backgroundColor"]. Ta funkcja rgb2hex()nie jest potrzebna. Oto wtyczka jQuery używająca haków CSS, którą zasugerowałem powyżej, która już wykonuje wszystkie weryfikacje w celu odzyskania kolorów w różnych przeglądarkach: stackoverflow.com/questions/6177454/ ...
Erick Petrucelli
2
@Ghigo, myślę, że źle zrozumiałeś: NIE POWINIENEŚ używać tej funkcji, jeśli jesteś w przeglądarce, która zwraca w formacie HEX. Ta funkcja konwertuje RGB na HEX i po prostu to. Nie używaj go, gdy nie jest w trybie RGB. Fakt, że potrzebujesz bardziej kompletnego rozwiązania (które wykrywa, czy wartość jest już równa RGB, jak stworzył @ Jim-F) nie zmienia faktu, że to rozwiązanie oferuje dokładnie to, czego żądał OP. Twój głos przeciw nie ma sensu, przepraszam.
Erick Petrucelli
4
Przepraszam, ale nie zgadzam się. Funkcja cross browser jest zawsze lepsza niż ta, która wymaga wykonania na podstawie wykrywania przeglądarki. Op poprosił o konwersję $('#selector').css('backgroundColor')na hex, a nie wartość rgb na hex. A na IE8 $('#selector').css('backgroundColor')jest już szesnastkowy, więc należy go obsłużyć. Otóż to. Nie złość się na mnie :)
Ghigo
1
Zróbcie to chłopaki, prosta jedna linijka, którą dodałem do rgb2hex()funkcji, dzięki @ErickPetru! Muszę kodować z powrotem do IE7, wierz lub nie. Z .css('backgroundColor')natywnym obj.style.backgroundColorIE7 i 8 zwróci wartość szesnastkową, a nie RGB, więc dodałem to jako pierwszą linię rgb2hex()funkcji w dostarczonej odpowiedzi, więc działa aż do IE7: /* 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 # symbolMam nadzieję, że to pomoże.
gfrobenius
61
Większość przeglądarek wydaje się zwracać wartość RGB podczas używania:
$('#selector').css('backgroundColor');
Tylko IE (dotychczas przetestowane tylko 6) zwraca wartość Hex.
Aby uniknąć komunikatów o błędach w IE, możesz owinąć funkcję instrukcją if:
Ten działa lepiej niż większość innych, ponieważ Jim bierze pod uwagę rgba, z czego korzysta Safari (przynajmniej w Mac OS X). Dzięki, Jim!
Pascal Lindelauf
1
Świetne rozwiązanie. Zauważ, że funkcja zwraca małe litery, tj. # Ff5544, a nie # FF5544.
Peter
To wyrażenie regularne będzie również obsługiwać kanały aplha w powyższym rozwiązaniu rgb = rgb.match (/ ^ rgba? ((\ D +), \ s * (\ d +), \ s * (\ d +) (?:, \ S * (0 \. \ D +))?) $ /);
Henning Winter
działa jak urok
ucMedia
22
Zaktualizowano @ErickPetru pod kątem kompatybilności z rgba:
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]);}
Zaktualizowałem wyrażenie regularne, aby odpowiadało wartości alfa, jeśli zostało zdefiniowane, ale nie używałem tego.
Tylko dla kompletności: pracuję nad czymś, co wyeksportuje do PowerPointa (nie pytaj ...) i akceptuje czwarty bajt ciągu szesnastkowego dla kanału alfa, więc można to wykorzystać w następujący sposób: 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)) : ''); Usuwam również #symbol, aby uczynić go agnostycznym względem ostatecznego użycia (można pobrać dane wyjściowe i dodać je 0xna przykład przedrostkiem lub pozostawić bez prefiksu). Mam nadzieję, że to komuś pomoże!
Óscar Gómez Alcañiz
10
Oto jedna linijka ES6, która nie używa jQuery:
var rgb = document.querySelector('#selector').style['background-color'];return'#'+ rgb.substr(4, rgb.indexOf(')')-4).split(',').map((color)=> parseInt(color).toString(16)).join('');
Dzięki, to pomogło mi włączyć to do strony Wordpress, która usuwa ukośniki wyrażenia regularnego z poprzednich odpowiedzi.
Jason
5
Oto wersja, która również sprawdza przezroczystość. Potrzebowałem tego, ponieważ mój obiekt miał wstawić wynik do atrybutu stylu, gdzie przezroczystą wersją koloru szesnastkowego jest w rzeczywistości słowo „przezroczysty” ..
// Color objectvarColor=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);}returnfalse;}});},
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
};}};
Czytelny i wolny od rejestracji bez rejestracji (bez rejestracji)
Stworzyłem funkcję, która używa czytelnych podstawowych funkcji i żadnych reg-expów.
Funkcja przyjmuje kolor w formacie hex, rgb lub rgba CSS i zwraca reprezentację szesnastkową.
EDYCJA: wystąpił błąd z analizowaniem formatu rgba (), naprawiony ...
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 samereturn"#"+('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);}
Nie działa na rgba (0,0,0,0). Po pierwsze: kolejność musi się zmienić .replace("rgba", "") .replace("rgb", "") .replace("(", "") .replace(")", "");W przeciwnym razie zostanie Ci a0,0,0,0. I zwraca # 000000, czyli czarny zamiast przezroczystego.
Dwanaście 24
Jeśli czwarta wartość w rgba to 0 (zero), to dla css dla tego 'elementu' będzie to: element {color: # 000000, opacity: 0.0;} który jest przezroczysty lub po prostu warunkowo zwróci 'rgba (0,0 , 0,0) 'z powrotem do dzwoniącego.
Dwanaście 24
@ Twelve24 Naprawiono parsowanie - właściwie zauważyłem to przed przeczytaniem twojego komentarza, ale zdecydowanie za to dziękuję :), Co do przezroczystości - funkcja ma zwracać kolor HEXA, czyli "kolor bazowy" - tak, żeby był celowo :)
jave.web
3
Próbować
// 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``
// rgb - 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``
console.log(rgb2hex("rgb(12,233,43"));
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);
bardziej zwięzły, jednoliniowy:
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);
zmuszanie jQuery do zawsze zwracania wartości hex:
Wystarczy dodać do powyższej odpowiedzi @ Justina.
powinno być
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('');
Ponieważ powyższe funkcje parsowania int obcinają wiodące zera, w ten sposób generują nieprawidłowe kody kolorów składające się z 5 lub 4 liter, np. Dla rgb (216, 160, 10) generuje # d8a0a, podczas gdy powinno być # d8a00a.
W starszych wersjach IE pobieranie wartości koloru obiektu za pomocą jquery może czasami zwracać wartość szesnastkową zamiast rgb, podczas gdy większość nowoczesnych przeglądarek zwraca wartość RGB. Funkcja połączona z obsługuje oba przypadki użycia
Paul T,
1
Odpowiedź Stevena Pribilinskiya pomija wiodące zera, na przykład # ff0000 staje się # ff00.
Rozwiązaniem jest dołączenie wiodącego 0 i podciągów z ostatnich 2 cyfr.
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);
Odpowiedzi:
( Źródło )
źródło
rgb.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i)
Jednak podane wyrażenie regularne jest zaprojektowane tak, aby poradzić sobie z formatem podanym przez przeglądarkę podczas korzystania z jQuery i nie ma różnych odstępów białych lub spójnych znaków mówisz o. Możesz również użyć tego samego wyrażenia regularnego i po prostu usunąć wszystkie białe znaki i przekonwertować je na małe litery przed dopasowaniem do rgb. PS Twój przykład skrzypiec: 'rgb (10, 128,)' Nie sądzę, aby testowanie było rozsądneOto czystsze rozwiązanie, które napisałem na podstawie sugestii @Matt:
Niektóre przeglądarki już zwracają kolory w postaci szesnastkowej (od Internet Explorera 8 i starszych). Jeśli chcesz poradzić sobie z takimi przypadkami, po prostu dołącz warunek wewnątrz funkcji, jak zasugerował @gfrobenius:
Jeśli używasz jQuery i chcesz bardziej kompleksowego podejścia, możesz użyć hooków CSS dostępnych od wersji jQuery 1.4.3, jak pokazałem, odpowiadając na to pytanie: Czy mogę wymusić zwracanie jQuery.css ("backgroundColor") w formacie szesnastkowym?
źródło
document.getElementById("your_id").currentStyle["backgroundColor"]
. Ta funkcjargb2hex()
nie jest potrzebna. Oto wtyczka jQuery używająca haków CSS, którą zasugerowałem powyżej, która już wykonuje wszystkie weryfikacje w celu odzyskania kolorów w różnych przeglądarkach: stackoverflow.com/questions/6177454/ ...$('#selector').css('backgroundColor')
na hex, a nie wartość rgb na hex. A na IE8$('#selector').css('backgroundColor')
jest już szesnastkowy, więc należy go obsłużyć. Otóż to. Nie złość się na mnie :)rgb2hex()
funkcji, dzięki @ErickPetru! Muszę kodować z powrotem do IE7, wierz lub nie. Z.css('backgroundColor')
natywnymobj.style.backgroundColor
IE7 i 8 zwróci wartość szesnastkową, a nie RGB, więc dodałem to jako pierwszą linięrgb2hex()
funkcji w dostarczonej odpowiedzi, więc działa aż do IE7:/* 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 # symbol
Mam nadzieję, że to pomoże.Większość przeglądarek wydaje się zwracać wartość RGB podczas używania:
Tylko IE (dotychczas przetestowane tylko 6) zwraca wartość Hex.
Aby uniknąć komunikatów o błędach w IE, możesz owinąć funkcję instrukcją if:
źródło
Zaktualizowano @ErickPetru pod kątem kompatybilności z rgba:
Zaktualizowałem wyrażenie regularne, aby odpowiadało wartości alfa, jeśli zostało zdefiniowane, ale nie używałem tego.
źródło
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)) : '');
Usuwam również#
symbol, aby uczynić go agnostycznym względem ostatecznego użycia (można pobrać dane wyjściowe i dodać je0x
na przykład przedrostkiem lub pozostawić bez prefiksu). Mam nadzieję, że to komuś pomoże!Oto jedna linijka ES6, która nie używa jQuery:
źródło
Oto wersja, która również sprawdza przezroczystość. Potrzebowałem tego, ponieważ mój obiekt miał wstawić wynik do atrybutu stylu, gdzie przezroczystą wersją koloru szesnastkowego jest w rzeczywistości słowo „przezroczysty” ..
źródło
Funkcja zwracająca kolor tła elementu w postaci szesnastkowej.
przykład użycia:
jsfiddle
źródło
Ta sama odpowiedź jak odpowiedź @Jim F, ale składnia ES6 , więc mniej instrukcji:
źródło
klasa koloru pobrana z próbnika kolorów bootstrap
jak używać
źródło
Czytelny i wolny od rejestracji bez rejestracji (bez rejestracji)
Stworzyłem funkcję, która używa czytelnych podstawowych funkcji i żadnych reg-expów.
Funkcja przyjmuje kolor w formacie hex, rgb lub rgba CSS i zwraca reprezentację szesnastkową.
EDYCJA: wystąpił błąd z analizowaniem formatu rgba (), naprawiony ...
źródło
.replace("rgba", "") .replace("rgb", "") .replace("(", "") .replace(")", "");
W przeciwnym razie zostanie Ci a0,0,0,0. I zwraca # 000000, czyli czarny zamiast przezroczystego.Próbować
Pokaż fragment kodu
źródło
Ten wygląda trochę ładniej:
bardziej zwięzły, jednoliniowy:
zmuszanie jQuery do zawsze zwracania wartości hex:
źródło
Wystarczy dodać do powyższej odpowiedzi @ Justina.
powinno być
Ponieważ powyższe funkcje parsowania int obcinają wiodące zera, w ten sposób generują nieprawidłowe kody kolorów składające się z 5 lub 4 liter, np. Dla rgb (216, 160, 10) generuje # d8a0a, podczas gdy powinno być # d8a00a.
Dzięki
źródło
Oto rozwiązanie, które znalazłem, które nie powoduje błędów skryptów w IE: http://haacked.com/archive/2009/12/29/convert-rgb-to-hex.aspx
źródło
Odpowiedź Stevena Pribilinskiya pomija wiodące zera, na przykład # ff0000 staje się # ff00.
Rozwiązaniem jest dołączenie wiodącego 0 i podciągów z ostatnich 2 cyfr.
źródło
Ponieważ pytanie dotyczyło JQuery, oto wtyczka JQuery oparta na kodzie Daniela Elliotta:
Używaj go jak:
źródło
Oto moje rozwiązanie, również robi touppercase za pomocą argumentu i sprawdza inne możliwe odstępy i wielkie litery w dostarczonym ciągu.
Na jsfiddle
Porównanie prędkości w jsperf
Dalsza poprawa mogłoby być
trim()
nargb
ciągźródło
Moje piękne, niestandardowe rozwiązanie
HTML
jQuery
Wynik
źródło