2016-11-13 4 views
0

У меня есть программа, которая генерирует изображение в оттенках серого. Grayshading для каждого пикселя задается следующим кодом съязвил:C++ Расчет цвета от grayscape до цвета

//loop over all pixel 
    *PixelColorPointer = Number * 0x010101; 

в этом случае Number представляет собой целое число в диапазоне от 0 до 255. который генерирует все градации серого цвета от черного до белого.

Что я пытаюсь сделать, это иметь цветное изображение (для того, чтобы иметь false colors), но я действительно не понимаю вычисления с шестнадцатеричным значением. Я понял, назначил ли я, например. Number * 0xFFFFFF У меня есть градиент/разнообразие от белого до желтого.

Может кто-нибудь объяснить мне, как работает расчет этих цветов? Пожалуйста, помните, что (как уже было сказано) я хочу/должен передать переменную Number, чтобы получить разнообразие.

+0

'Number * 0x010101' это элегантный способ превращения (скажем) 5 в 0x00050505 - то есть, он задает г, г , b - число. То, что я делал в прошлом, вычисляет таблицу с 256 входами с нужными цветами в ней.Ваша «текущая таблица» (если она была сохранена, а не вычисленная) будет 0x00000000, 0x00010101, 0x00020202, 0x00030303 .... 0x00FEFEFE, 0x00FFFFFF. Итак, сделайте таблицу с 256 ячейками из 4-байтных целых чисел. Установите каждый цвет в RGB, затем используйте 'Number' в качестве индекса.' * PixelColorPointer = colArray [Number] ' – enhzflep

ответ

0

Вам нужно предоставить дополнительную информацию. Какую библиотеку функции вы используете для этого?

Но только видя проблемы, я думаю, что шестнадцатеричное число относится к color в Color-шестнадцатеричном коде номер будет относиться к яркости 0 является пустым и 255 макс интенсивность цвета (белый)

EDIT: на самом деле я думаю, что целое число в результате:

Number * 0x010101 

ли шестнадцатеричный цветовой код, в частном случае 0x010101Номер работает как интенсивность. Но любой другой шестнадцатеричный даст вам какой-то странный результат.

Используйте таблицу кодов цветовой шестигранной выбрать любой случайный цвет и только вход:

*PixelColorPointer = 0XHEXCODE; 

если выход желаемого цвета, то я прав

0

RGB цвета сохраняются побайтно (0 до 255).

Когда вы говорите 0x010203 это (в шестнадцатеричном виде) 01 красный, зеленый 02 и 03 синий. Он также может быть инвертирован (03 красный, 02 зеленый, 01 синий) в зависимости от вашего Endianness.

Здесь вы должны отделить свои 3 цвета. Затем вы умножаете каждый цвет на коэффициент.

Вы можете сохранить свой цвет в союзе, это самый простой способ.

union Color 
{ 
    struct 
    { 
    unsigned char b; 
    unsigned char g; 
    unsigned char r; 
    unsigned char a; // Useless here 
    }; 
    unsigned int full; 
}; 

Color c; 
c.full = 0x102030; 

unsigned char res = 0.229 * c.r + 0.587 * c.g + 0.114 * c.b; 

Color grey; 
grey.r = grey.g = grey.b = res; 

0,229, 0,587 и 0,114 являются Relative luminance.

Помните, что вам может понадобиться, чтобы инвертировать порядок RGBA и переместить a место :)

Смежные вопросы