Необходимо значение 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);
Да все в исполнении градации серого Допустим у нас есть числа от 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, избавиться от плавающей арифметики, добавлять дополнительные цвета итд.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
У меня есть односвязный списокВ нем надо перегрузить [] так, чтоб был доступ к элементу в заданной позиции
Столкнулся с такой проблемойХочу поменять название окна программы с MainWindow на своё
Гарантировано ли стандартом, что этот код выведет в консоль (устройство вывода - консоль, а не какое-то другое) следующую строку?