Преобразовать double в RGB(Qcolor)

162
30 апреля 2019, 22:50

Необходимо значение double преобразовать в цвет, чтобы потом использовать в функции SetPixel(x,y,qRGB). Есть такой код преобразования, но по-моему он не работает.

int red = Math.Min((int)(X * 256), 255);
int green = Math.Min((int)((X * 256 - red) * 256), 255);
int blue = Math.Min((int)(((X * 256 - red) * 256 - green) * 256), 255);
Answer 1

Да все в исполнении градации серого Допустим у нас есть числа от 0 до 5, с двумя знакми после запятой(0.15 и т.п). 0 -это 0, 5 это 255

Тогда всё просто:

constexpr double minColorValue = 0, maxColorValue = 5.0;
double X = getMyColorValue ();
X = (X - minColorValue) / (maxColorValue - minColorValue)  // ужимаем значения в диапазон 0÷1
QColor col = QColor::fromRGBF (X,X,X);    
SetPixel(x,y,col.rgb());

или, что в данном случае тоже самое:

QColor col = QColor::fromHSVF (0,0,X);

или

QColor col = QColor::fromHSLF (0,0,X);

см. документацию по QColor

Updated

Если я правильно понял исходную задачу, то для каждого пикселя генерируемой картинки есть значение и нужно отобразить его в градиенте цветов скажем от красного (для 0.0) и максимум (1.0) зелёным. Для того чтобы получить промежуточные цвета градиента применяют цветовую интерполяцию (color interpolation). В самом примитивном варианте это будет нечто следующее:

QColor col1 = QColor::fromRGB (255, 0, 0);
QColor col2 = QColor::fromRGB (0, 255, 0);
double fac = getMyColorValue ();
QColor target = QColor::fromRGB (
                    col1.red()  * fac + col2.red()   * (1-fac),
                    col1.green()* fac + col2.green() * (1-fac),
                    col1.blue() * fac + col2.blue()  * (1-fac)
                );
SetPixel(x,y,col.rgb());

В более приятных/практичных/интересных вариантах можно проводить интерполяцию в пространстве hsv/hsl, избавиться от плавающей арифметики, добавлять дополнительные цвета итд.

READ ALSO
Перегрузка оператора [] C++

Перегрузка оператора [] C++

У меня есть односвязный списокВ нем надо перегрузить [] так, чтоб был доступ к элементу в заданной позиции

174
Как изменить название окна программы в Qt

Как изменить название окна программы в Qt

Столкнулся с такой проблемойХочу поменять название окна программы с MainWindow на своё

216
Выведет ли Hello, World!?

Выведет ли Hello, World!?

Гарантировано ли стандартом, что этот код выведет в консоль (устройство вывода - консоль, а не какое-то другое) следующую строку?

146