Pergunta

Eu não tenho certeza como pedir isso, mas aqui vai.

Eu desenhar um retângulo colorido cheio na tela. A cor é em forma de R, G, B

Então eu quero desenhar texto na parte superior do retângulo, no entanto, a cor do texto tem que ser tal que fornece o melhor contraste, o que significa que é legível.

Exemplo:

Se eu desenhar um retângulo preto, a cor óbvia para texto seria branco.

O que eu tentei agora é este. Eu passar esta função a cor do retângulo e retorna uma cor invertida que eu, em seguida, usar para o meu texto.

Ele funciona, mas não é o melhor caminho.

Todas as sugestões?

// 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);
}
Foi útil?

Solução

Uma abordagem simples que é garantido para dar uma cor significativamente diferente é para alternar o bit de topo de cada componente do RGB triplo.

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

Se a cor original # 1AF283, o "inverso" será # 9A7203.

O contraste será significativo. Eu não faço nenhuma garantia sobre a estética.

Update, 2009/04/03: Eu experimentei com este e outros esquemas. Resultados em meu blog .

Outras dicas

A cor mais legível vai ser branco ou preto. O 'calmante' cor mais vai ser algo que não é branco nem preto, ele vai ser uma cor que contrasta levemente sua cor de fundo. Não há nenhuma maneira de fazer isso por meio de programação, pois é subjetivo. Você não vai encontrar a cor mais legível para todos, porque todo mundo vê as coisas de forma diferente.

Algumas dicas sobre cor, nomeadamente no que respeita primeiro plano e justaposição de fundo, tais como com o texto.

O olho humano é essencialmente uma lente simples e, portanto, só pode efetivamente se concentrar em uma cor de cada vez. As lentes utilizadas na maioria das câmeras modernas contornar esse problema usando múltiplas lentes de diferentes índices de refração (lentes cromáticas), de modo que todas as cores estão em foco ao mesmo tempo, mas o olho humano não é tão avançada.

Por essa razão, os usuários devem ter apenas se concentrar em uma cor de cada vez para ler o texto. Isto significa que ou o primeiro plano é na cor, ou o fundo, mas nunca ambos. Isto leva a uma condição normalmente chamado de vibração, em que o olho rapidamente foco muda entre primeiro plano e cores de fundo, tentando resolver a forma, mas nunca resolve, a forma nunca está em foco, e isso leva a fadiga ocular.

A sua função não funcionará se você fornecê-lo com RGB (127127127), porque ele vai voltar a exata mesma cor. (Modificando sua função retornar preto ou branco seria ligeiramente melhorar as coisas)

A melhor maneira de ter sempre as coisas legíveis é ter texto branco com preto em torno dele, ou o contrário.

É oftenly alcançado por primeiro desenho texto preto em (X-1, Y-1), (x + 1, y-1), (x + 1, y-1), (x + 1, x + 1 ), e, em seguida, texto branco em (x, y).

Como alternativa, você pode primeiro desenhar um bloco preto semi-transparente, e em seguida, texto branco não-transparente sobre ele. Que garante que sempre haverá uma certa quantidade de contraste entre o fundo e seu texto.

Por cinza? preto ou branco seria melhor. branco em cores escuras, preto em cores claras. basta ver se a luminância é acima de um limite e escolher um ou outro

(você não precisa o .NET, C # ou asp.net marcas, por sinal)

Você precisa estudar um pouco de teoria da cor. Um programa chamado "Color Wheel Pro" é divertido para brincar com e dar-lhe a idéia geral.

Essencialmente, você está procurando cores complementares para uma determinada cor.

Dito isso, eu acho que você vai achar que enquanto a teoria da cor ajuda, você ainda precisa de um olho humano para afinar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top