Конвертирование странного числа в формат rgb

Рейтинг: 2Ответов: 2Опубликовано: 24.01.2023

Пытаюсь получить цвет в формате rgb от моей wifi лампочки, но получаю это:

"2442110"

Как я могу это расшифровать?

Ответы

▲ 3

По всей видимости, ваша лампочка возвращает значение цвета в формате Decimal.

Я нашел на просторах enSO функцию, позволяющую конвертировать этот формат в rgba:

function ARGBtoRGBA(num) {
  num >>>= 0;
  let b = num & 0xFF,
    g = (num & 0xFF00) >>> 8,
    r = (num & 0xFF0000) >>> 16,
    a = ((num & 0xFF000000) >>> 24) / 255;
  return "rgba(" + [r, g, b, a].join(",") + ")";
}

let x = ARGBtoRGBA(2442110);

console.log(x);

▲ 2

Каждый цвет в RGB - это числа, которые принимают значения [0, 255] -> [0, 16^2 - 1]

Чтобы перевести из RGB - в число нужно умножать каждую из них на 256 в степени позиции, но позиционировать надо с права налево

Например: пусть есть R(1)G(1)B(1) - делаем следующее:

256^0 * B(1) + 256^1 * G(1) + 256^2 * R(1) = 1 * 1 + 256 * 1 + 65536 * 1 = 65793

У нас же задача ровно обратная из числа получить цвета RGB

Пусть нам дано число 65793, тогда надо:

  1. Разделить это число на 256^2 = 65536 => 65793 / 65536 = 1 (257)
  2. Делим остаток на 256^1 = 256 => 257 / 256 = 1 (1)
  3. Делим остаток на 256^0 = 1 => 1 / 1 = 1

Таким образом можно любое число представить в виде RGB

Код:

const intToRGB = (int) => {
  const R = Math.floor(int / 256 ** 2);
  const G = Math.floor((int % 256 ** 2) / 256 ** 1);
  const B = ((int % 256 ** 2) % 256) / 256 ** 0;
  
  return `R - ${R} G - ${G} B - ${B}`;
}

const integers = [0, 65793, 2442110, 16777215];

console.log(integers.map(intToRGB));

Или же

const intToRGB = (int) => {
  const R = Math.floor(int / 65536);
  const G = Math.floor((int % 65536) / 256);
  const B = (int % 65536) % 256;
  
  return `R - ${R} G - ${G} B - ${B}`;
}

const integers = [0, 65793, 2442110, 16777215];

console.log(integers.map(intToRGB));

Или же

const intToRGB = (int) => {  
  const R = Math.floor(int / 65536);
  
  int -= R * 65536;
  
  const G = Math.floor(int / 256);
  const B = int - G * 256;
  
  return `R - ${R} G - ${G} B - ${B}`;
}

const integers = [0, 65793, 2442110, 16777215];

console.log(integers.map(intToRGB));

Или же

const intToRGB = (int) => {  
  const R = int >> 16;
  
  int -= R << 16;
  
  const G = int >> 8;  
  const B = int - (G << 8);
  
  return `R - ${R} G - ${G} B - ${B}`;
}

const integers = [0, 65793, 2442110, 16777215];

console.log(integers.map(intToRGB));

Однострочник (не используйте это :) )

const intToRGB = (int) => `R - ${int >> 16} G - ${int -= (int >> 16) << 16, int >> 8} B - ${int - ((int >> 8) << 8)}`;

const integers = [0, 65793, 2442110, 16777215];

console.log(integers.map(intToRGB));