Библиотеки: OK Color Space

 

OK Color Space:

Конвертация цвета из формата RGB в формат OKhsl (OKhsv) и обратно

Автор: Maxim Savochkin

 
Зачетно.
Громоздко правда очень.
Демку бы переписал под управление мышкой со слайдерами. Сейчас не очень удобно и наглядно. 
Но в целом 5 звезд. 
Тот кто поставил 1 звезду - просто чудак не в теме. 
 
Nikolai Semko #:

Демку бы переписал под управление мышкой со слайдерами. Сейчас не очень удобно и наглядно. 

например так


Файлы:
 
Спасибо за фидбэк, попробую сделать другой интерфейс. Кстати, есть такой color picker, но не удобно, что без формата RGB: https://bottosson.github.io/misc/colorpicker/
 
Maxim Savochkin #:
Спасибо за фидбэк, попробую сделать другой интерфейс. Кстати, есть такой color picker, но не удобно, что без формата RGB: https://bottosson.github.io/misc/colorpicker/

Господа!

Вижу вы хорошо разбираетесь в цветах.

Подскажите пожалуйста как отличить светлый цвет от тёмного?

Светлым я считаю тот цвет на котором лучше видно чёрные буквы, тёмный тот на котором лучше видно белые буквы.

 
Aleksandr Slavskii #:

Господа!

Вижу вы хорошо разбираетесь в цветах.

Подскажите пожалуйста как отличить светлый цвет от тёмного?

Светлым я считаю тот цвет на котором лучше видно чёрные буквы, тёмный тот на котором лучше видно белые буквы.

если грубо, то если сумма байтов цвета больше 382, то цвет текста черный, если меньше или равно, то белый.
Но это не гарантирует что текс будет заметен. Поэтому лучше иметь функции подбора цвета шрифта. 
Например:

union argb {
   uint clr;
   uchar c[4];
};
uint AnotherColor(uint back) {
   argb c;
   c.clr=back;
   c.c[0]=(c.c[0]>127)?0:255;
   c.c[1]=(c.c[1]>127)?0:255;
   c.c[2]=(c.c[2]>127)?0:255;
   return c.clr;
}

не проверял, но должно работать

 
Nikolai Semko #:

если грубо, то если сумма байтов цвета больше 382, то цвет текста черный, если меньше или равно, то белый.
Но это не гарантирует что текс будет заметен. Поэтому лучше иметь функции подбора цвета шрифта. 
Например:

не проверял, но должно работать

Ахренеть!!!

Да вы батенька, волшебник )))

 
Aleksandr Slavskii #:

Господа!

Вижу вы хорошо разбираетесь в цветах.

Подскажите пожалуйста как отличить светлый цвет от тёмного?

Светлым я считаю тот цвет на котором лучше видно чёрные буквы, тёмный тот на котором лучше видно белые буквы.

Эту библиотеку как раз можно использовать и для определения "светлоты" цвета - формат OKhsl правильно определяет "светлоту" (lightness) для любого оттенка. Например, часто желтый оттенок выглядит светлее, а синий темнее - OKhsl учитывает эту особенность и рассчитывает "реальную светлоту", как она воспринимается человеческим глазом.

Я использую такую функцию для выбора между черным и белым цветом текста:

#include  <OK Color Space.mqh>
//+------------------------------------------------------------------+
//| GetTextColor                                                     |
//+------------------------------------------------------------------+
color GetTextColor(
                   color bg_color
                  )
  {
   OKhsl check_l;
   ColorToOKhsl(bg_color,check_l);
   if(check_l.l<64.f) {return(clrWhite);}
   else               {return(clrBlack);}
  }

Получается, что если lightness фона меньше 64, то нужен белый текст, а если больше 64, то черный.

Вместо 64 можно использовать другое значение, но мне кажется что это лучше всего подходит.

 

Попытался решить эту же задачу, вот что получилось:


Сверху  - это образец отсюда с надписью oKhs1, снизу - мой.

Вроде ровнее, но яркость не получается выше поднять.

 

Для определения цвета текста в зависимости от цвета фона можно примерно так: переводим в серый:

   double RGBtoGraySimple(double aR,double aG,double aB)
     {
      aR/=255;
      aG/=255;
      aB/=255;
      double rY=0.3*aR+0.59*aG+0.11*aB;
      return(rY);
     }

Если значение больше 0.5 - значит, фон светлый, если ниже - темный.

 
Dmitry Fedoseev #:

Попытался решить эту же задачу, вот что получилось:


Сверху  - это образец отсюда с надписью oKhs1, снизу - мой.

Вроде ровнее, но яркость не получается выше поднять.

По-моему в верхней полосе что-то произошло из-за сжатия изображения, можете проверить мой код:

Файлы:
Причина обращения: