Преобразование значения цвета RGB в десятичное
Как преобразовать значение цвета RGB в простое десятичное число?
Итак, у меня есть: RGB (255,255,255) белый
Его десятичный эквивалент: 16777215
Я пробовал, думая, что это может быть:
var dec = r*g*b; // but this doesn't work
хотя это не сработает.
кто-нибудь знает алгоритм/уравнение для преобразования из RGB (или rgba) в decimal?
5 ответов
целые числа RGB обычно рассматриваются как три разных байта, где самый левый (самый высокий порядок) байт красный, средний байт зеленый, а самый правый (самый низкий порядок) байт синий. Вы можете получить значения этих отдельных байтов следующим образом:
var c = 0xff03c0; // 16712640
var components = {
r: (c & 0xff0000) >> 16,
g: (c & 0x00ff00) >> 8,
b: (c & 0x0000ff)
};
вы можете воссоздать цвет из его компонентов, переместив байты обратно в:
c = (components.r << 16) + (components.g << 8) + (components.b);
в вашем случае, просто заменить components.r
(etc)с вашими фактическими переменными.
гораздо лучший ответ (с точки зрения ясности) таков:
'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-ваше длинное целое число (десятичное), которое вы хотите сделать. Легко, да? Конечно, bitshift
var dec = (b & 0xff) << 16 + (g & 0xff) << 8 + (r & 0xff);
(Я думаю, что это правильный порядок для значений r,g,b)
обновление
Я только что проверил браузерные приложения, и я получил неправильный порядок, поэтому правильная формула для браузеров (читать HTML + CSS+javascript):
var dec = r << 16 + g << 16 + b;
предполагая значения r,g,b
другие API могут ожидать другого порядка для значений r,g,B. Кажется, я помню, по крайней мере, один, который имеет обратный порядок (в моем первоначальном ответе), но я подумайте, какой из них сейчас.
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);
вам нужно влево-сдвинуть R на 16, G влево на 8 и или оба в B. посмотрите на значения как биты, и все станет ясно:
R 255 = 11111111B G 255 = 11111111B B 255 = 11111111B
Shift R 16: 111111110000000000000000 Shift G 8: 000000001111111100000000
или в B: 111111111111111111111111
преобразовать в десятичный: 16777215