Eu encontrei um problema semelhante. Eu tive que encontrar um bom método para selecionar cores de fonte contrastantes para exibir rótulos de texto em escalas de cores / mapas de calor. Tinha que ser um método universal e a cor gerada tinha que ser "bonita", o que significa que a simples geração de cores complementares não era uma boa solução - às vezes gerava cores estranhas e muito intensas que eram difíceis de assistir e ler.
Após longas horas de teste e tentando resolver esse problema, descobri que a melhor solução é selecionar fonte branca para cores "escuras" e fonte preta para cores "brilhantes".
Aqui está um exemplo de função que estou usando em C #:
Color ContrastColor(Color color)
{
int d = 0;
// Counting the perceptive luminance - human eye favors green color...
double luminance = ( 0.299 * color.R + 0.587 * color.G + 0.114 * color.B)/255;
if (luminance > 0.5)
d = 0; // bright colors - black font
else
d = 255; // dark colors - white font
return Color.FromArgb(d, d, d);
}
Isso foi testado em várias escalas de cores (arco-íris, escala de cinza, calor, gelo e muitas outras) e é o único método "universal" que eu descobri.
Editar
Alterada a fórmula da contagem a
para "luminância perceptiva" - realmente parece melhor! Já o implementei no meu software, parece ótimo.
Edit 2 O
@WebSeed forneceu um excelente exemplo prático desse algoritmo: http://codepen.io/WebSeed/full/pvgqEq/
Apenas no caso de alguém desejar uma versão mais curta, talvez mais fácil de entender, da resposta do GaceK :
Nota: eu removi a inversão do luma valor (para tornar as cores brilhantes têm um valor mais alto, o que parece mais natural para mim e é também o método de cálculo 'default'.
Usei as mesmas constantes do GaceK daqui, pois elas funcionaram muito bem para mim.
(Você também pode implementar isso como um método de extensão usando a seguinte assinatura:
Você pode chamá-lo via
foregroundColor = background.ContrastColor()
.)fonte
Obrigado @Gacek . Aqui está uma versão para Android:
E uma versão melhorada (mais curta):
fonte
1 - ...
peça e renomeie-aa
paraluminance
Minha rápida implementação da resposta de Gacek:
fonte
Javascript [ES2015]
fonte
Obrigado por este post.
Para quem estiver interessado, aqui está um exemplo dessa função no Delphi:
fonte
Esta é uma resposta tão útil. Obrigado por isso!
Eu gostaria de compartilhar uma versão do SCSS:
Agora, descubra como usar o algoritmo para criar automaticamente cores flutuantes para links de menu. Cabeçalhos claros ficam mais escuros e vice-versa.
fonte
Implementação Flutter
fonte
Python feio, se você não quiser escrever :)
fonte
Eu tive o mesmo problema, mas tive que desenvolvê-lo em PHP . Usei a solução da @ Garek e também usei esta resposta: Converter hex hex em valores RGB em PHP para converter o código de cores HEX em RGB.
Então, eu estou compartilhando.
Eu queria usar essa função com a cor Background Background HEX, mas nem sempre começando com '#'.
fonte
Como extensão Kotlin / Android:
fonte
Uma implementação para o objetivo-c
fonte
iOS Swift 3.0 (extensão UIColor):
fonte
Exemplo do Swift 4:
UPDATE - Verificou-se que
0.6
era uma cama de teste melhor para a consultafonte
CGColor.components
varia de acordo com o espaço de cores: por exemplo,UIColor.white
quando convertido em um CGColor, possui apenas dois:[1.0, 1.0]
representando uma cor de escala de cinza (totalmente branca) com um alfa completo. Um melhor meio de extrair os elementos RGB de um UIColor éUIColor.getRed(_ red:, green:, blue:, alpha:)
Observe que existe um algoritmo para isso na biblioteca de fechamento do Google que faz referência a uma recomendação do w3c: http://www.w3.org/TR/AERT#color-contrast . No entanto, nesta API, você fornece uma lista de cores sugeridas como ponto de partida.
fonte
Se você está manipulando espaços de cores para efeito visual, geralmente é mais fácil trabalhar em HSL (matiz, saturação e luminosidade) do que RGB. Mover cores em RGB para dar efeitos naturalmente agradáveis tende a ser bastante conceitualmente difícil, enquanto converter em HSL, manipulá-lo e convertê-lo novamente é mais intuitivo em conceito e, invariavelmente, gera resultados melhores.
A Wikipedia tem uma boa introdução ao HSL e ao HSV estreitamente relacionado. E há um código gratuito na rede para fazer a conversão (por exemplo, aqui está uma implementação em javascript )
A transformação precisa que você usa é uma questão de gosto, mas, pessoalmente, eu pensaria que a reversão dos componentes Hue e Lightness geraria uma boa cor de alto contraste como primeira aproximação, mas você pode facilmente obter efeitos mais sutis.
fonte
Você pode ter qualquer texto de matiz em qualquer fundo de matiz e garantir que seja legível. Eu faço isso o tempo todo. Existe uma fórmula para isso em Javascript em Texto legível em cores - STW * Como se diz nesse link, a fórmula é uma variação no cálculo do ajuste de gama inversa, embora um IMHO um pouco mais gerenciável. Os menus no lado direito desse link e suas páginas associadas usam cores geradas aleatoriamente para texto e plano de fundo, sempre legíveis. Então, sim, claramente isso pode ser feito, não há problema.
fonte
Uma variação do Android que captura o alfa também.
(obrigado @ thomas-vos)
fonte
base
Versão R da resposta de @ Gacek para obterluminance
(você pode aplicar seu próprio limite facilmente)Uso:
fonte
Com base na resposta de Gacek , e depois de analisar o exemplo do @ WebSeed com a extensão do navegador WAVE , criei a seguinte versão que escolhe texto em preto ou branco com base na taxa de contraste (conforme definido nas Diretrizes de Acessibilidade para Conteúdo da Web (WCAG) 2.1 do W3C ) , em vez de luminância.
Este é o código (em javascript):
Um exemplo de trabalho pode ser encontrado no meu fork do codepen do @ WebSeed, que produz zero erros de baixo contraste no WAVE.
fonte