Показать сообщение отдельно
  #5 (permalink)  
Старый 22.07.2009, 14:13
Интересующийся
Отправить личное сообщение для mouse_web Посмотреть профиль Найти все сообщения от mouse_web
 
Регистрация: 21.07.2009
Сообщений: 10

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

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

Спасибо за внимание!
Ответить с цитированием