Russian Qt Forum
Март 28, 2024, 23:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Адаптация цветовой схемы  (Прочитано 5488 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Апрель 29, 2017, 09:37 »

Добрый день

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

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

Спасибо
Записан
mitrich
Гость
« Ответ #1 : Апрель 29, 2017, 11:10 »

Можно наверное для каждого элемента палитры вычислить отклонение от основного цвета по V в модели HSV (QColor::value) и хранить их, потом брать новый основный цвет и рассчитывать остальные цвета в соответствии с этим отклонением.
Есть ещё конструктор QPalette::QPalette(const QColor &button), рассчитывающий палитру из основного цвета с захардкоженными отклонениями.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Апрель 29, 2017, 11:34 »

Можно наверное для каждого элемента палитры вычислить отклонение от основного цвета по V в модели HSV (QColor::value) и хранить их, потом брать новый основный цвет и рассчитывать остальные цвета в соответствии с этим отклонением.
Не очень ясно как. Пример: дефаулт фон (203, 203, 203), юзер установил (240, 240, 180). Как пересчитать цвет (153, 153. 153) ?
Записан
mitrich
Гость
« Ответ #3 : Апрель 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));
 
« Последнее редактирование: Апрель 29, 2017, 12:23 от mitrich » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Апрель 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? Напр некоторые кнопки "тоже серые" но с легкой синевой. Без этого смотрится механистично (одни градации фона)
Записан
mitrich
Гость
« Ответ #5 : Апрель 29, 2017, 14:22 »

Тогда можно перемножать RGB цветов на RGB нового фона. Или среднее арифметическое находить. Или какой-нибудь другой режим смешивания подобрать -  Blend modes.
Например, открыть скриншот контролов в графическом редакторе и посмотреть, какой режим смешивания с квадратом, залитым фоновым цветом будет давать наиболее приемлемый результат.
« Последнее редактирование: Апрель 29, 2017, 14:25 от mitrich » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Апрель 30, 2017, 10:19 »

Тогда можно перемножать RGB цветов на RGB нового фона. Или среднее арифметическое находить. Или какой-нибудь другой режим смешивания подобрать -  Blend modes.
Много вариантов обычно значит "ничего реального"  Улыбающийся Сделал так: value вычисляю предложенным Вами способом, а если конвертируемый цвет имеет ненулевую saturation, то создаю временный цвет в модели RGB, псевдокод
Код:
QColor temp = old_Color + new_Back - default_Back;
И из него беру hue и saturation. Ну "как-то работает", пока неясно как

Спасибо

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.094 секунд. Запросов: 23.