Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Вёрстка веб-сайтов > Подбор цвета шрифта (алгоритм)


Автор: tapa 15.8.2010, 10:34
Привет. В моём проекте цвет фона, для ячеек таблицы, "дёргается" из базы. Цвет шрифта прописан "жёстко", например чёрный. Но чёрный на тёмно синем почти не видно.
Как сделать так, чтобы, например, для "тёмных цветов фона" цвет шрифта светлый и наоборот.

М,не сам алгоритм,а просто его описание. Типа: для цвета в ARGB > X цвет такой,для  ARGB < X цвет другой.

Автор: ksnk 15.8.2010, 11:35
tapa, Если на пальцах, то можно преобразовать rgb цвет в http://ru.wikipedia.org/wiki/HSV_(%D1%86%D0%B2%D0%B5%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C)
последний параметр (V) цвета в нотации HSV будет яркостью цвета. 

-- По яркости можно выбирать белый для темного и черный для светлого фона. Еще нужно определить для параметра H диапазон "синего цвета" ( судя по картинке 190-290), для этого диапазона нужно выбрать светлый цвет.

-- Можно еще выбрать "противоположный" цвет по этой нотации (180-H), открутить ему яркость на 100. Получится контрастный к фону цвет. Хотя результат иногда странен  smile 

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

Автор: tapa 15.8.2010, 11:57
ksnk, Спасибо! Как раз то что нужно smile

Автор: tapa 15.8.2010, 12:47
Код

        public static void ColorToHSV(Color color, out double hue, out double saturation, out double value)
        {
            int max = Math.Max(color.R, Math.Max(color.G, color.B));
            int min = Math.Min(color.R, Math.Min(color.G, color.B));

            hue = color.GetHue();
            saturation = (max == 0) ? 0 : 1d - (1d * min / max);
            value = Math.Round(max / 255d,1);
        }

Код

            double hue, saturation, value;
            Color txtColor;

            //color -  передаётся в параметрах
            ColorToHSV(color, out hue, out saturation, out value);
            if (hue > 190 && hue < 290)//Blue
                txtColor = Color.White;
            else
                txtColor = (value <= 0.5) ? Color.White : Color.Black;


Уж незнаю насколько корректно
Код

txtColor = (value <= 0.5) ? Color.White : Color.Black;


Но для "моих" цветов "отрабатывает" smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)