Конвертировать из цвета HEX в структуру RGB в C - PullRequest
9 голосов
/ 16 сентября 2010

Преобразование из цветного HEX-кода в RGB в чистом c с использованием только библиотеки C (без C ++, шаблонов и т. Д.) Структура RGB может быть такой:двойной г;двойной б;} RGB1;функция должна вернуть RGB1

Ответы [ 4 ]

21 голосов
/ 16 сентября 2010

Предполагая, что ваше шестнадцатеричное значение имеет 32-битный тип 'int', и что мы используем структуру RGB, описанную выше, тогда, возможно, сделаем что-то вроде:

struct RGB colorConverter(int hexValue)
{
  struct RGB rgbColor;
  rgbColor.r = ((hexValue >> 16) & 0xFF) / 255.0;  // Extract the RR byte
  rgbColor.g = ((hexValue >> 8) & 0xFF) / 255.0;   // Extract the GG byte
  rgbColor.b = ((hexValue) & 0xFF) / 255.0;        // Extract the BB byte

  return rgbColor; 
}
12 голосов
/ 16 сентября 2010

Значение RGB может быть сохранено как целое число через 0xRRGGBB.Примеры:

  • Красный: 0xff0000
  • Зеленый: 0x00ff00
  • Синий: 0x0000ff

00 - шестнадцатеричное для десятичного 0, тогда как ffравно 255. 0 соответствует 0,0, а 255 - 1,0.(На самом деле вы не указали, что это за диапазон. Я предполагаю, что от 0,0 до 1,0.)

Итак, с учетом вышеизложенных допущений, вам нужно извлечь каждый компонент и разделить на 255. Поскольку это звучит очень похоже навопрос домашней работы, я просто покажу вам, как вы можете сделать красный компонент.

int hex = 0x123456;
c.r = ((hex >> 16) & 0xff) / 255.0;

Каждая шестнадцатеричная цифра занимает 4 бита.Поэтому сдвиньте вправо на 16 бит (чтобы переместить все 4 цифры вправо), чтобы 0xRRGGBB стал 0xRR.Теперь у вас есть красный компонент.(На всякий случай, если в целом числе есть данные выше, вы можете избавиться от них, маскируя данные с помощью & 0xff.)

Если вы имеете дело со строкой "#FFFFFF", тогда вы 'Сначала нужно преобразовать его в целое число, чтобы вышеприведенное сработало.

8 голосов
/ 08 ноября 2016

Если шестнадцатеричный код является строкой, вы можете разобрать его следующим образом

char *str = "0000FF";
int r, g, b;
sscanf(str, "%02x%02x%02x", &r, &g, &b);

То есть, целые, а не двойные. Также убедитесь, что sscanf возвращает 3, количество прочитанных элементов.

1 голос
/ 19 декабря 2014

Я предполагаю, что RGB может храниться как 0xRRGGBB на некоторых системах, но в Windows он фактически хранится как 0xBBGGRR (см. http://msdn.microsoft.com/en-us/library/windows/desktop/dd183449). Как упоминается в статье, уже есть макросы GetRValue, GetGValue и GetBValue.

...