Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как определить цвет (темный он или светлый)? (https://javascript.ru/forum/dom-window/4432-kak-opredelit-cvet-temnyjj-ili-svetlyjj.html)

mouse_web 21.07.2009 22:47

Как определить цвет (темный он или светлый)?
 
Помогите, пожалуйста, разобраться.
У меня на сайте пользователь выбирает фон для своего объявления (цветовая палитра 256 цветов). В зависимости от цвета фона нужно менять цвет текста (черный или белый). Как определить какой фон выбрал пользователь, темный или светлый?

Octane 22.07.2009 03:34

Поищите формулы перевода цвета из RGB-представления в HSL (точно не помню, как называется), там должна быть составляющаяя яркости.

B~Vladi 22.07.2009 11:11

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

mouse_web 22.07.2009 12:07

Цитата:

Сообщение от Octane (Сообщение 25006)
Поищите формулы перевода цвета из RGB-представления в HSL (точно не помню, как называется), там должна быть составляющаяя яркости.

Спасибо!
Это то что нужно.
Как напишу код обязательно опубликую.

mouse_web 22.07.2009 14:13

Вот что получилось.

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 помимо светлоты еще учитывается параметр цветового тона. Т.к. например "желтый цвет" и "синий" одинаковой светлоты по тону совсем разные (желтый -светлее, синий - темнее).

Спасибо за внимание! :)

Riim 22.07.2009 14:20

Я так делал:
var light = (this.r * 0.8 + this.g + this.b * 0.2) / 510 * 100;

mouse_web 22.07.2009 14:35

Riim,
Так гораздо эффективнее. Спасибо!


Часовой пояс GMT +3, время: 19:28.