2011-12-12 12 views
8

Jak przekonwertować wartość koloru RGB na zwykły dziesiętny?Konwertuj wartość koloru RGB na dziesiętną

Więc mam: RGB (255,255,255) jest biały
Jego odpowiednik dziesiętny: 16777215

Próbowałem myśleć to może być po prostu:

var dec = r*g*b; // but this doesn't work 

Mimo, że nie działa.

Ktoś wie o algorytmie/równaniu do konwersji z RGB (lub rgba) na dziesiętny?

+2

16,777,215 to dziesiętny odpowiednik wersji szesnastkowej, 0x00FFFFFF, twojego RGB (255,255,255). –

+0

Co zamierzasz zrobić z tymi wartościami? Do jakiego oprogramowania/funkcji/etc je masz? –

+0

Mam wartości kolorów z aplikacji Flash, które są dziesiętne i muszę wyświetlać je w html/css i również konwertować wstecz w wersji visa-versa. –

Odpowiedz

10

Liczby całkowite RGB są zazwyczaj traktowane jako trzy różne bajty, gdzie bajt po lewej stronie (najwyższy) jest czerwony, środkowy bajt jest zielony, a bajt po prawej stronie (najniższy) jest niebieski . Można pobierać wartości tych poszczególnych bajtów tak:

var c = 0xff03c0; // 16712640 
var components = { 
    r: (c & 0xff0000) >> 16, 
    g: (c & 0x00ff00) >> 8, 
    b: (c & 0x0000ff) 
}; 

Można odtworzyć kolor z jego elementów przez przesunięcie bajtów z powrotem w:

c = (components.r << 16) + (components.g << 8) + (components.b); 

W twoim przypadku, po prostu zastąpić components.r (etc) z twoimi rzeczywistymi zmiennymi.

3
var dec = (b & 0xff) << 16 + (g & 0xff) << 8 + (r & 0xff); 

(myślę, że to poprawna kolejność dla R, G, B wartości)

Aktualizacja

Właśnie sprawdziłem w aplikacjach przeglądarek i mam nakaz źle, więc prawidłowa Wzór do przeglądarki HTML odczytu (CSS + + JavaScript) wynosi:

var dec = r << 16 + g << 16 + b; 

Zakładając, R, g, b = 255 wartości <

Inne interfejsy API mogą oczekiwać innej kolejności dla wartości r, g, b. Wydaje mi się, że pamiętam przynajmniej jednego, który ma odwrócony porządek (według mojej oryginalnej odpowiedzi), ale myślę, który to jest w tej chwili.

+0

Być może masz rację co do zamówienia, w którym to przypadku moja odpowiedź jest błędna :( –

+0

Poprawna kolejność pod względem tego, dla kogo? Kolejność zależy od tego, kto * odczytuje * wartość. –

+0

@Nicol - Nie, poprawna kolejność zależy od API. Nie jestem pewien co do API Win32, ale dla aplikacji przeglądarkowych (które, jak zakładam, jest adresowane tutaj) jestem prawie pewien, że Blue jest bajtem wyższego rzędu (z trzech) i Czerwony jest bajtem niskiego rzędu –

0

trzeba lewej przesunięcie o 16 R, G pozostawić 8, lub jednocześnie z B. sprawdzenie wartości bitów jak i wszystkie staną się jasne:

R 255 = 11111111B G 255 = 11111111B B 255 = 11111111B

Przesunięcie R16: +111111110000000000000000 Przesunięcie G 8: +000000001111111100000000

lub do B: 111111111111111111111111

prz rt na dziesiętne: 16777215

1
if (color.substr(0, 1) === '#') { 
    return color; 
} 
var digits = /(.*?)rgb\((\d+), (\d+), (\d+)\)/.exec(color); 
var red = parseInt(digits[2]); 
var green = parseInt(digits[3]); 
var blue = parseInt(digits[4]); 
var rgb = blue | (green << 8) | (red << 16); 
return rgb.toString(10); 
+1

rgb.toString (10) jest tym, czego potrzebowałem –

5

Znacznie lepsze rozwiązanie (pod względem klarowności) jest taka:

'Convert RGB to LONG: 
LONG = B * 65536 + G * 256 + R 

'Convert LONG to RGB: 
B = LONG \ 65536 
G = (LONG - B * 65536) \ 256 
R = LONG - B * 65536 - G * 256 

LONG to długa liczba całkowita (po przecinku), które chcesz zrobić. Łatwy huh? Oczywiście, bitshift

+1

Myślę, że przesunięcie bitów jest o wiele jaśniejsze. –

+0

@ DanielA.White może nie myśleć tak, ale nie widzę, aby jakakolwiek inna odpowiedź na to pytanie była w połowie tak jasna jak ta. Nawet ja mogę to zrozumieć. –

Powiązane problemy