Estou tentando avaliar o escurecimento de uma cor escolhida por um seletor de cores para ver se é "muito preto" e, em caso afirmativo, defina-o como branco. Achei que poderia usar os primeiros caracteres do valor hexadecimal para fazer isso. Está funcionando, mas também está trocando algumas cores "claras" legítimas.
Eu tenho um código fazendo isso:
if (lightcolor.substring(0,3) == "#00"|| lightcolor.substring(0,3) == "#010"){
lightcolor="#FFFFFF";
color=lightcolor;
}
Deve haver uma maneira mais eficiente com a matemática hexadecimal de saber que uma cor ultrapassou um certo nível de escuridão? Como se lightcolor + "algum valor hexadecimal" <= "algum valor hexadecimal", defina-o como branco.
Eu adicionei tinyColor, que pode ser útil para isso, mas não tenho certeza.
javascript
colors
Dshiz
fonte
fonte
Respostas:
Você deve extrair os três componentes RGB individualmente e, em seguida, usar uma fórmula padrão para converter os valores RGB resultantes em seu brilho percebido.
Supondo uma cor de seis caracteres:
EDITAR
Desde maio de 2014
tinycolor
passou a ter umagetBrightness()
função, embora usando os fatores de ponderação CCIR601 em vez dos ITU-R acima.EDITAR
O intervalo de valor luma resultante é 0..255, onde 0 é o mais escuro e 255 é o mais claro. Valores maiores que 128 são considerados leves por
tinycolor
. (copiado descaradamente dos comentários de @ pau.moreno e @Alnitak)fonte
luma
intervalo de valores resultante é0..255
, onde0
é o mais escuro e255
é o mais claro (a soma dos três coeficientes é um).isDark()
limite é codificado em 128A biblioteca TinyColor (você já mencionou) oferece várias funções para inspecionar e manipular cores, entre elas:
getBrightness
é leve
está escuro
getLuminance
fonte
Encontrei esta função WooCommerce Wordpress PHP ( wc_hex_is_light ) e converti para JavaScript. Funciona bem!
fonte
Você pode calcular a luminância :
Portanto, é ótimo escolher se o texto deve ser branco ou preto.
O método acima permite que você passe a cor em formatos diferentes, mas o algoritmo é basicamente apenas em
luminance_get
.Quando o usei, estava definindo a cor para preto se a luminância fosse maior que
180
, branco caso contrário.fonte
Há uma distinção importante aqui entre luminância e brilho. Luminância, no final do dia, é uma medida de quanta energia viaja por uma determinada área e ignora completamente como nossos sistemas perceptivos percebem essa energia. O brilho, por outro lado, é uma medida de como percebemos essa energia e leva em consideração a relação entre a luminância e nosso sistema perceptivo. (Como ponto de confusão, existe um termo chamado luminância relativa, que parece ser usado como sinônimo de termos de brilho. Isso me enganou bem).
Para ser preciso, você está procurando por "brilho" ou "valor" ou "luminância relativa", como outros sugeriram. Você pode calcular isso de várias maneiras diferentes (como ser humano!) Http://en.wikipedia.org/wiki/HSL_and_HSV#Lightness
fonte
Este trabalho com hex, por exemplo #fefefe
Você pode alterá-lo para retornar
true
oufalse
por alteraçãopara
fonte
Uma possível solução seria converter sua cor de RGB para HSB . HSB significa matiz, saturação e brilho (também conhecido como HSV, onde V é o valor). Então você tem apenas um parâmetro para verificar: brilho.
fonte
Sei que essa conversa já existe há alguns anos, mas ainda é relevante. Eu queria acrescentar que minha equipe estava tendo o mesmo problema em Java (SWT) e achei um pouco mais preciso:
fonte