Preciso determinar se um UIColor selecionado (escolhido pelo usuário) é escuro ou claro, para que eu possa alterar a cor de uma linha de texto que fica em cima dessa cor, para melhor legibilidade.
Aqui está um exemplo em Flash / Actionscript (com demonstração): http://web.archive.org/web/20100102024448/http://theflashblog.com/?p=173
Alguma ideia?
Saúde Andre
ATUALIZAR
Graças às sugestões de todos, aqui está o código de trabalho:
- (void) updateColor:(UIColor *) newColor
{
const CGFloat *componentColors = CGColorGetComponents(newColor.CGColor);
CGFloat colorBrightness = ((componentColors[0] * 299) + (componentColors[1] * 587) + (componentColors[2] * 114)) / 1000;
if (colorBrightness < 0.5)
{
NSLog(@"my color is dark");
}
else
{
NSLog(@"my color is light");
}
}
Obrigado mais uma vez :)
Respostas:
W3C tem o seguinte: http://www.w3.org/WAI/ER/WD-AERT/#color-contrast
Se você estiver fazendo apenas texto em preto ou branco, use o cálculo de brilho de cor acima. Se estiver abaixo de 125, use texto branco. Se for 125 ou superior, use texto preto.
edição 1: tendência para texto preto. :)
editar 2: A fórmula a ser usada é ((valor vermelho * 299) + (valor verde * 587) + (valor azul * 114)) / 1000.
fonte
NSArray *components = (NSArray *)CGColorGetComponents([UIColor CGColor]);
para obter uma matriz de componentes de cores, incluindo o alfa. Os documentos não especificam a ordem em que estão, mas presumo que seja vermelho, verde, azul, alfa. Além disso, nos documentos, "o tamanho da matriz é um a mais do que o número de componentes do espaço de cores da cor." - não diz por que ...Aqui está uma extensão Swift (3) para realizar esta verificação.
Esta extensão funciona com cores em tons de cinza. No entanto, se você estiver criando todas as suas cores com o inicializador RGB e não usando as cores embutidas como
UIColor.black
eUIColor.white
, então possivelmente você pode remover as marcas adicionais.Testes:
Nota: Atualizado para Swift 3 07/12/18
fonte
components[0]
. Assim:let componentColorX: CGFloat = components[1]
Usando a resposta de Erik Nedwidek, eu vim com aquele pequeno trecho de código para fácil inclusão.
fonte
UIColor whiteColor, grayColor, blackColor
.Swift3
fonte
Versão Swift 4
fonte
Minha solução para este problema em uma categoria (extraída de outras respostas aqui). Também funciona com cores em tons de cinza, o que nenhuma das outras respostas fazia no momento.
fonte
Extensão Swift 3 mais simples:
fonte
Se você preferir a versão em bloco:
fonte
Para tudo que não é acinzentado, o inverso RGB de uma cor geralmente é altamente contrastado com ela. A demonstração apenas inverte a cor e remove a saturação (converte para um cinza).
Mas gerar uma combinação de cores suave e agradável é bastante complicado. Olhe para :
http://particletree.com/notebook/calculating-color-contrast-for-legible-text/
fonte
O método a seguir é descobrir que a cor é clara ou escura na linguagem Swift com base na cor branca.
O método a seguir é descobrir que a cor é clara ou escura no Swift usando componentes de cor.
fonte
Para mim, usar apenas CGColorGetComponents não funcionou, recebo 2 componentes para UIColors como branco. Portanto, tenho que verificar o espaço de coresModel primeiro. Isso é o que eu descobri que acabou sendo a versão rápida da resposta de @mattsven.
Espaço de cores retirado daqui: https://stackoverflow.com/a/16981916/4905076
fonte
UIColor tem o seguinte método para converter para o espaço de cores HSB :
fonte
Swift 5
Versão adicionada :fonte
UIColor
for uma cor em tons de cinza. Uma cor RGB aleatória não funcionará com este código.Se você deseja encontrar o brilho da cor, aqui estão alguns pseudocódigos:
Se for> 0,5, é claro e escuro.
fonte