Преобразование значения цвета 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