PDA

Просмотр полной версии : Инверсия цвета



Oscar
27.03.2005, 20:07
Дан RGB цвет, как получить инверсный к нему?

То есть, цвет, который был бы лучше всего виден на фоне заданного?

Зачем? Select, например. Если выбраный элемент подсвечивается бэкфоном - то нужно и цвет шрифта менять.

Почему нельзя зашить цвет Selecta? В Java, например, используются настройки ОС пользователя. И если я правильно понял - цвет Select берётся пользовательский, а шрифт - всегда белый. Само собой проблемы, когда SelectColor = white.

Варианты решения:
1. 255 -RGB
Быстро, просто, делает то, что нужно, за исключением средней области цветов.

2. (RGB+128) mod 256
вопреки ожиданиям - результаты хуже, чем пункт 1.
кроме того, непривычно, что инверсия чёрного - это серый, а не белый.

Экспериментальная таблица(255-RGB):
http://home.informatik.tu-muenchen.de/~skrypnyo/inv_color/
Страница написана, по сути, только на JavaScript, потому её можно сохранить и поэкспериментировать с ф-цией inv(number), если будет желание.

Показать проблему:
http://home.informatik.tu-muenchen.de/~skrypnyo/inv_color/?showborder=yes

Удалить проблемные участки:
http://home.informatik.tu-muenchen.de/~skrypnyo/inv_color/?cutcolors=yes

Может кто-то сталкивался с подобной проблемой, или просто знает её решение?

Oscar
27.03.2005, 20:27
Нашел практическое решение проблемы, теорией не обьеснимое ))

Всё равно, какой у нас фон:

if (green < 160) textColor = 'FFFFFF';
else textColor = '000000';

Не красиво, не понятно, но работает!
И пользователь всегда будет видеть текст при Select.

http://home.informatik.tu-muenchen.de/~skrypnyo/inv_color/practice.html

Если всё же кто-то знает нормальное решение - буду очень рад.

Игорь Акопян
28.03.2005, 11:24
Возможно я сейчас большой глупость скажу - чур больно не бить! ;)
Как-то очень давно и в графике дабы курсор был виден на разноцветном фоне для этих целей использовался XOR...

Oscar
28.03.2005, 16:57
Игорь Акопян, спасибо, что заглянул в эту тему.
Но .. :-) XOR вернул точно тот же результат, что и 255-RGB, и, наверное, это правильно.

Anton Tyo
29.06.2005, 21:39
Берем за аксиому: наибольно контрастно выглядят элементы у которых разница в яркости максимальна.

Яркость можно расчитывать разными способами:
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

Твое решение тоже хорошо работает, т.к. яркостной вес у зеленого наибольший.