Russian Qt Forum

Qt => Общие вопросы => Тема начата: Igors от Апрель 29, 2017, 09:37



Название: Адаптация цветовой схемы
Отправлено: Igors от Апрель 29, 2017, 09:37
Добрый день

Сейчас background светло-серый и палитры всех контролов подобраны в масть, тоже цвета близкие к светло-серому. Есть настройка цвета которая меняет только background. Делать такие настройки для всех контролов - длинно, утомительно для юзверя и, думается, неэффективно. Как автоматом/пулеметом пересчитать цвета контролов? А то сейчас они с новым фоном смотрятся как "инородные тела". Ну понятно что фон меняется "в разумных пределах" (остается достаточно светлым для черного текста)

Что имеете предложить?

Спасибо


Название: Re: Адаптация цветовой схемы
Отправлено: mitrich от Апрель 29, 2017, 11:10
Можно наверное для каждого элемента палитры вычислить отклонение от основного цвета по V в модели HSV (QColor::value) и хранить их, потом брать новый основный цвет и рассчитывать остальные цвета в соответствии с этим отклонением.
Есть ещё конструктор QPalette::QPalette(const QColor &button), рассчитывающий палитру из основного цвета с захардкоженными отклонениями.


Название: Re: Адаптация цветовой схемы
Отправлено: Igors от Апрель 29, 2017, 11:34
Можно наверное для каждого элемента палитры вычислить отклонение от основного цвета по V в модели HSV (QColor::value) и хранить их, потом брать новый основный цвет и рассчитывать остальные цвета в соответствии с этим отклонением.
Не очень ясно как. Пример: дефаулт фон (203, 203, 203), юзер установил (240, 240, 180). Как пересчитать цвет (153, 153. 153) ?


Название: Re: Адаптация цветовой схемы
Отправлено: mitrich от Апрель 29, 2017, 12:18
Вроде так
Код
C++ (Qt)
//Цвета по умолчанию...
QColor base = QColor::fromRgb(203, 203, 203);
QColor color1 = QColor::fromRgb(153, 153, 153);
//QColor color2 = ...
//QColor color3 = ...
 
double delta1 = color1.valueF() / base.valueF();
double delta2 = color2.valueF() / base.valueF();
double delta3 = color3.valueF() / base.valueF();
//...
 
QColor newBase = QColor::fromRgb(240, 240, 180);
 
//Рассчитываем новые на основе newBase
QColor newColor1 = QColor::fromHsvF(newBase.hueF(), newBase.saturationF(), std::min(newBase.valueF() * delta1, 1.0));
QColor newColor2 = QColor::fromHsvF(newBase.hueF(), newBase.saturationF(), std::min(newBase.valueF() * delta2, 1.0));
QColor newColor3 = QColor::fromHsvF(newBase.hueF(), newBase.saturationF(), std::min(newBase.valueF() * delta3, 1.0));
 


Название: Re: Адаптация цветовой схемы
Отправлено: Igors от Апрель 29, 2017, 12:58
Код
C++ (Qt)
QColor newColor1 = QColor::fromHsvF(newBase.hueF(), newBase.saturationF(), std::min(newBase.valueF() * delta1, 1.0));
 
Это годится для градаций серого, но что делать если color1(2, 3) имеет свои (ненулевые) hue и saturation? Напр некоторые кнопки "тоже серые" но с легкой синевой. Без этого смотрится механистично (одни градации фона)


Название: Re: Адаптация цветовой схемы
Отправлено: mitrich от Апрель 29, 2017, 14:22
Тогда можно перемножать RGB цветов на RGB нового фона. Или среднее арифметическое находить. Или какой-нибудь другой режим смешивания подобрать -  Blend modes (https://en.wikipedia.org/wiki/Blend_modes).
Например, открыть скриншот контролов в графическом редакторе и посмотреть, какой режим смешивания с квадратом, залитым фоновым цветом будет давать наиболее приемлемый результат.


Название: Re: Адаптация цветовой схемы
Отправлено: Igors от Апрель 30, 2017, 10:19
Тогда можно перемножать RGB цветов на RGB нового фона. Или среднее арифметическое находить. Или какой-нибудь другой режим смешивания подобрать -  Blend modes (https://en.wikipedia.org/wiki/Blend_modes).
Много вариантов обычно значит "ничего реального"  :) Сделал так: value вычисляю предложенным Вами способом, а если конвертируемый цвет имеет ненулевую saturation, то создаю временный цвет в модели RGB, псевдокод
Код:
QColor temp = old_Color + new_Back - default_Back;
И из него беру hue и saturation. Ну "как-то работает", пока неясно как

Спасибо