Как определить цвет (темный он или светлый)?
Помогите, пожалуйста, разобраться.
У меня на сайте пользователь выбирает фон для своего объявления (цветовая палитра 256 цветов). В зависимости от цвета фона нужно менять цвет текста (черный или белый). Как определить какой фон выбрал пользователь, темный или светлый? |
Поищите формулы перевода цвета из RGB-представления в HSL (точно не помню, как называется), там должна быть составляющаяя яркости.
|
Если эта самая палитра представляет собой картинку (некий спектр), при клике по ней передаёте на сервер координаты мышки, относительно картинки. На сервере, имея такую же картинку и координаты, можно узнать выбранный цвет и передать обратно клиенту.
|
Цитата:
Это то что нужно. Как напишу код обязательно опубликую. |
Вот что получилось.
1. Переводим цвет HTML -> RGB -> HSL 2. Получаем: H - цветовой тон (например, красный, зелёный или сине-голубой), S - насыщенность, L - светлота (именно светлота, а не яркость) от 0 до 1. 3. Меняем цвет на нужный function rgb2hsl(HTMLcolor) { r = parseInt(HTMLcolor.substring(0,2),16) / 255; g = parseInt(HTMLcolor.substring(2,4),16) / 255; b = parseInt(HTMLcolor.substring(4,6),16) / 255; var max = Math.max(r, g, b), min = Math.min(r, g, b); var h, s, l = (max + min) / 2; if (max == min) { h = s = 0; } else { var d = max - min; s = l > 0.5 ? d / (2 - max - min) : d / (max + min); switch (max) { case r: h = (g - b) / d + (g < b ? 6 : 0); break; case g: h = (b - r) / d + 2; break; case b: h = (r - g) / d + 4; break; } h /= 6; } return [h, s, l]; // H - цветовой тон, S - насыщенность, L - светлота } function changeColor (HTMLcolor) { e = rgb2hsl(HTMLcolor); if ((e[0]<0.55 && e[2]>=0.5) || (e[0]>=0.55 && e[2]>=0.75)) { fc = '#000000'; // черный } else { fc = '#FFFFFF'; // белый } // далее меняем цвет, где это необходимо } changeColor ('FF0000'); В функции changeColor помимо светлоты еще учитывается параметр цветового тона. Т.к. например "желтый цвет" и "синий" одинаковой светлоты по тону совсем разные (желтый -светлее, синий - темнее). Спасибо за внимание! :) |
Я так делал:
var light = (this.r * 0.8 + this.g + this.b * 0.2) / 510 * 100; |
Riim,
Так гораздо эффективнее. Спасибо! |
Часовой пояс GMT +3, время: 17:14. |