Дан RGB цвет, как получить инверсный к нему?
То есть, цвет, который был бы лучше всего виден на фоне заданного?
Зачем? Select, например. Если выбраный элемент подсвечивается бэкфоном - то нужно и цвет шрифта менять.
Почему нельзя зашить цвет Selecta? В Java, например, используются настройки ОС пользователя. И если я правильно понял - цвет Select берётся пользовательский, а шрифт - всегда белый. Само собой проблемы, когда SelectColor = white.
Варианты решения:
1. 255 -RGB
Быстро, просто, делает то, что нужно, за исключением средней области цветов.
2. (RGB+128) mod 256
вопреки ожиданиям - результаты хуже, чем пункт 1.
кроме того, непривычно, что инверсия чёрного - это серый, а не белый.
Экспериментальная таблица(255-RGB):
http://home.informatik.tu-muenchen.de/~ ... inv_color/
Страница написана, по сути, только на JavaScript, потому её можно сохранить и поэкспериментировать с ф-цией inv(number), если будет желание.
Показать проблему:
http://home.informatik.tu-muenchen.de/~ ... border=yes
Удалить проблемные участки:
http://home.informatik.tu-muenchen.de/~ ... colors=yes
Может кто-то сталкивался с подобной проблемой, или просто знает её решение?
Инверсия цвета
- Oscar
- Сообщения: 963
- Зарегистрирован: 29 май 2004, 13:44
- Откуда: Мюнхен (рожден в Киеве)
- Контактная информация:
Нашел практическое решение проблемы, теорией не обьеснимое ))
Всё равно, какой у нас фон:
if (green < 160) textColor = 'FFFFFF';
else textColor = '000000';
Не красиво, не понятно, но работает!
И пользователь всегда будет видеть текст при Select.
http://home.informatik.tu-muenchen.de/~ ... ctice.html
Если всё же кто-то знает нормальное решение - буду очень рад.
Всё равно, какой у нас фон:
if (green < 160) textColor = 'FFFFFF';
else textColor = '000000';
Не красиво, не понятно, но работает!
И пользователь всегда будет видеть текст при Select.
http://home.informatik.tu-muenchen.de/~ ... ctice.html
Если всё же кто-то знает нормальное решение - буду очень рад.
- Игорь Акопян
- Сообщения: 1440
- Зарегистрирован: 13 окт 2004, 17:11
- Откуда: СПБ
- Контактная информация:
Возможно я сейчас большой глупость скажу - чур больно не бить! 
Как-то очень давно и в графике дабы курсор был виден на разноцветном фоне для этих целей использовался XOR...

Как-то очень давно и в графике дабы курсор был виден на разноцветном фоне для этих целей использовался XOR...

Берем за аксиому: наибольно контрастно выглядят элементы у которых разница в яркости максимальна.
Яркость можно расчитывать разными способами:
1. L = R + G + B
2. L = max(R, G, B) + min(R, G, B)
3. L = max(R, G, B),
4. L = 0.3 * R + 0.59 * G + 0.11 * B. лучше всего соответствующее человеческому восприятию
Для случая 1 получаем:
если (R + B + G) > 255 * 3 / 2 тогда
Требуемый цвет = #000000
иначе
Требуемый цвет = #FFFFFF
Для случая 2 получаем:
если max(R, G, B) + min(R, G, B) > 255 тогда
Требуемый цвет = #000000
иначе
Требуемый цвет = #FFFFFF
Для случая 3 получаем:
если max(R, G, B) > 255 / 2 тогда
Требуемый цвет = #000000
иначе
Требуемый цвет = #FFFFFF
Для случая 4 получаем:
если 0.3 * R + 0.59 * G + 0.11 * B > (0.3 * 255 + 0.59 * 255 + 0.11 * B) / 2 тогда
Требуемый цвет = #000000
иначе
Требуемый цвет = #FFFFFF
Твое решение тоже хорошо работает, т.к. яркостной вес у зеленого наибольший.
Яркость можно расчитывать разными способами:
1. L = R + G + B
2. L = max(R, G, B) + min(R, G, B)
3. L = max(R, G, B),
4. L = 0.3 * R + 0.59 * G + 0.11 * B. лучше всего соответствующее человеческому восприятию
Для случая 1 получаем:
если (R + B + G) > 255 * 3 / 2 тогда
Требуемый цвет = #000000
иначе
Требуемый цвет = #FFFFFF
Для случая 2 получаем:
если max(R, G, B) + min(R, G, B) > 255 тогда
Требуемый цвет = #000000
иначе
Требуемый цвет = #FFFFFF
Для случая 3 получаем:
если max(R, G, B) > 255 / 2 тогда
Требуемый цвет = #000000
иначе
Требуемый цвет = #FFFFFF
Для случая 4 получаем:
если 0.3 * R + 0.59 * G + 0.11 * B > (0.3 * 255 + 0.59 * 255 + 0.11 * B) / 2 тогда
Требуемый цвет = #000000
иначе
Требуемый цвет = #FFFFFF
Твое решение тоже хорошо работает, т.к. яркостной вес у зеленого наибольший.