2009-03-14 5 views
4

Я не уверен, как спросить об этом, но здесь.Найти наиболее читаемый цвет текста, который нарисован на цветной поверхности

Я рисую заполненный цветной прямоугольник на экране. Цвет находится в форме 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); 
} 

ответ

3

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

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

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

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

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

+0

Это потрясающе, работает очень хорошо. Что действительно делает перевернутый последний бит? Как то, что означает и почему это работает? – Gautam

+0

Забыл добавить, я использовал метод, который вы разместили, но затем превратил цвет в оттенки серого, и он отлично работает с точки зрения контраста. – Gautam

+0

Другой способ выразить это для каждого элемента (cR + 128)% 256. Вы перемещаетесь на полпути цветовое пространство. Или, если c.R был <128, вы добавляете 128, значительно увеличивая яркость, а если c.R было> = 128, вы вычитаете 128, делая его заметно темнее. –

1

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

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

2

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

1

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

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

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

+0

Если вы просто дополняете цвет и сохраняете яркость, человеческий глаз не будет хорошо разбираться в краях (края - это работа стержней, цвет - конусами). для удобства чтения вам нужен максимальный контраст яркости => черный или белый – Javier

2

Некоторые советы о цвете, особенно в отношении сопоставления переднего плана и фона, например, с текстом.

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

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

2

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

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

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

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