Найдите наиболее читаемый цвет текста, который рисуется на цветной поверхности - PullRequest
4 голосов
/ 14 марта 2009

Я не уверен, как спросить это, но здесь идет.

Я рисую закрашенный цветной прямоугольник на экране. Цвет в форме R, G, B

Затем я хочу нарисовать текст поверх прямоугольника, однако цвет текста должен быть таким, чтобы он обеспечивал наилучшую контрастность, то есть его можно было прочитать.

Пример:

Если я нарисую черный прямоугольник, очевидным цветом для текста будет белый.

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

Это работает, но это не лучший способ.

Есть предложения?

// eg. usage: Color textColor = GetInverseLuminance(rectColor);
private Color GetInverseLuminance(Color color)
{
    int greyscale = (int)(255 - ((color.R * 0.30f) + (color.G * 0.59f) + (color.B * 0.11f)));

    return Color.FromArgb(greyscale, greyscale, greyscale);
}

Ответы [ 6 ]

3 голосов
/ 14 марта 2009

Один простой подход, который гарантированно дает существенно другой цвет, состоит в переключении верхнего бита каждого компонента тройки RGB.

Color inverse(Color c)
{
    return new Color(c.R ^ 0x80, c.G ^ 0x80, c.B ^ 0x80);
}

Если исходный цвет был # 1AF283, "обратный" будет # 9A7203.

Контраст будет значительным. Я не даю никаких гарантий об эстетике.

Обновление, 2009/4/3: Я экспериментировал с этой и другими схемами. Результаты на мой блог .

2 голосов
/ 14 марта 2009

Ваша функция не будет работать , если вы предоставите ей RGB (127,127,127), потому что она вернет точно такой же цвет. (изменение вашей функции для возврата черного или белого цвета немного улучшит ситуацию)

Лучший способ всегда иметь удобочитаемые вещи - это иметь белый текст с черным вокруг него или наоборот.

Это часто достигается путем первого рисования черного текста в (x-1, y-1), (x + 1, y-1), (x + 1, y-1), (x + 1, x + 1 ), а затем белый текст в (x, y).

Кроме того, вы можете сначала нарисовать полупрозрачный черный блок, а затем непрозрачный белый текст поверх него. Это гарантирует, что между вашим фоном и текстом всегда будет определенный контраст.

2 голосов
/ 14 марта 2009

Несколько советов о цвете, в частности о сопоставлении переднего плана и фона, например, с текстом.

Человеческий глаз по сути является простой линзой, и поэтому может эффективно фокусироваться только на одном цвете за раз. Объективы, используемые в большинстве современных камер, решают эту проблему, используя несколько линз с различными показателями преломления (хроматические линзы), так что все цвета находятся в фокусе одновременно, но человеческий глаз не настолько продвинут.

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

2 голосов
/ 14 марта 2009

Наиболее читаемый цвет будет белым или черным. Наиболее «успокаивающий» цвет будет чем-то, что не является белым или черным, это будет цвет, который слегка контрастирует с цветом вашего фона. Нет способа сделать это программно, потому что это субъективно. Вы не найдете наиболее читаемый цвет для всех, потому что каждый видит вещи по-разному.

1 голос
/ 14 марта 2009

Вам нужно изучить теорию цвета. Программа под названием «Color Wheel Pro» - забавная игра, которая даст вам общее представление.

По сути, вы ищете дополнительные цвета для данного цвета.

Тем не менее, я думаю, вы обнаружите, что, хотя теория цвета помогает, вам все еще нужен человеческий глаз для тонкой настройки.

1 голос
/ 14 марта 2009

почему серый? черный или белый будет лучше. белый на темных тонах, черный на светлых тонах. просто посмотрите, не превышает ли яркость пороговое значение, и выберите одно или другое

(кстати, вам не нужны теги .net, c # или asp.net)

...