Программно гарантируйте, что палитра произвольного цвета ярка и отлична от фона

Хорошо, у меня есть спокойное применение GUI, где я решил произвести цветовую палитру беспорядочно (разрешающий мне отличить данные, показанные на основе уникальных идентификаторов данных).

Алгоритм, который я использую, как таким образом:

void Palette::generatePalette(quint32 seed, bool dark) {
    sfmt_t sfmt;
    sfmt_init_gen_rand(&sfmt, seed);
    quint32 i;
    qreal hue;
    QColor col;

    qreal lightness = 0.75;
    qreal saturation = 0.6;

    if (dark) {
        lightness = 0.5;
        saturation = 0.8;
    }

    for (i = 0; i < numberOfColors; i++) {
        hue = sfmt_genrand_res53(&sfmt);
        hue += 0.618033988749895;
        hue = fmod(hue, 1.0);
        col = QColor::fromHslF(hue, saturation, lightness);
        palette.append(col);
    }
}

Это дает мне, по большей части, хорошие пастельные цвета, которые очень видимы на сером фоне. Однако иногда желтый прибывает, который не легко различим от фона.

То, что я хотел бы знать, возможно ли программно сравнить цвет фона с произведенным цветом и если это слишком неразличимо, чтобы тогда отказаться и восстановить цвет.

Я навел справки на Google об ответе, но я не могу найти тот. Я обычно не программист GUI, также, таким образом, я не работаю с цветом таким образом настолько часто.

2
nl ja de
В целом это могло бы быть немного хитро, но для вашего особого случая, так как ваша единственная случайная переменная - оттенок, я просто определил бы диапазон оттенков, которые вы считаете приемлемыми контролем и ограничиваете свой код, чтобы выбрать оттенок в том диапазоне.
добавлено автор Vaughn Cato, источник
Да it' s возможный сделать. I' m думающий это находится больше в области цветной теории, и возможно читающий о том, как работа цветов предложила бы вам понимание, необходимо придумать хороший алгоритм.
добавлено автор r_ahlskog, источник

1 ответы

Есть несколько цветные методы расстояния/различия.

Для вашего заявления (так как вы не требуете большой точности) вы могли использовать Евклидово расстояние (или другая норма в цветном метрическом пространстве), и если это расстояние ниже порога, вы пропустите цвет.

double colorRGBEuclideanDistance(const QColor& c1, const QColor& c2)
{
    return sqrt(pow(c1.red()-c2.red(), 2) +
                pow(c1.green()-c2.green(), 2) +
                pow(c1.blue()-c2.blue(), 2));
}
1
добавлено
Евклидово расстояние в RGB-космосе не очень хорошо как светло-серый и ярко-желтый цвет от Luke' s пример будет иметь большое расстояние, но будет тверд сказать обособленно. It' s лучше, чтобы использовать perceptional цветовую модель, как CIE: en.wikipedia.org/wiki/List_of_color_spaces_and_their_uses#CI‌ ​ E
добавлено автор Arne, источник
Я полностью соглашаюсь, на основе моего опыта, который CIELAB дает оптимальным результатам. Расстояние RGB было дано только для примера
добавлено автор pnezis, источник
Спасибо @pnezis. Я преобразовал в CIELAB и вычислил евклидово расстояние в том цветовом пространстве. Интересно, кажется, что желто-серое расстояние было самым большим, таким образом, я просто сделал свой порог верхним порогом. Кажется, добился цели. Однако теперь я сократил количество приемлемых цветов и таким образом, некоторые производятся дважды, который не идеален вообще.
добавлено автор Luke, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

Qt
Qt
703 участник(ов)

Группа взаимопомощи Qt.Делимся советами и помогаем друг другу. Наш информационный канал @ProQt Полезная информация для начинающих: #newcomer Познавательная информация: #fyi #didyouknow Наши друзья: Чат с/с++ @ProCxx

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest