Também disponível em: English · Español · Français · العربية
Gerador de cores aleatórias
Tire cores ao acaso em hexadecimal, distribuídas de forma uniforme pela luminosidade em vez de conforme calha no cubo RGB, com a opção de garantir que não há duas demasiado próximas.
O que é um gerador de cores aleatórias
Escolhe cores por si. A forma óbvia é tirar três números entre 0 e 255 e chamar cor ao resultado, que é o que quase todos os geradores fazem. Isso dá uma extração uniforme entre as 16 777 216 cores do cubo sRGB e, se só quer uma cor qualquer, funciona perfeitamente.
Deixa de funcionar assim que quer um *conjunto* delas — a legenda de um gráfico, cores de etiquetas, um conjunto de avatares — porque aparecem dois problemas que uma cor sozinha nunca lhe mostra: a distribuição não é uniforme para o olho, e as cores chocam entre si.
Este gerador também faz a versão ingénua, e identifica-a honestamente, mas por omissão amostra de forma uniforme na luminosidade percebida e rejeita qualquer cor que caia demasiado perto de outra já tirada.
Como usar o gerador
- Escolha quantas quer. De uma a vinte e quatro. O lote é redesenhado de imediato, e o primeiro é sempre o mesmo ao carregar a página, por isso nada se mexe enquanto lê.
- Escolha a amostragem e a separação. «Percetualmente uniforme» espalha o lote por toda a luminosidade; «sRGB uniforme» é a extração ingénua, mantida para que veja a diferença. A separação rejeita qualquer cor mais próxima do que a distância escolhida de outra já tirada.
- Copie uma, ou todas. Clique numa amostra para copiar o hexadecimal, ou leve o lote inteiro como lista separada por linhas. Carregue em «Novas cores» para outra extração.
O sRGB uniforme não está bem distribuído, e não no sentido que imagina
A queixa habitual sobre o RGB aleatório é que produz cores turvas e escuras. Contado exaustivamente sobre uma malha de 64×64×64 do cubo — 262 144 cores, arrumadas em décimos de luminosidade percebida — acontece o contrário. O décimo mais escuro contém **20 cores**. Não 20%: vinte. O seguinte tem 950. Juntos, o quinto mais escuro da gama percetual representa 0,37% do cubo, e a banda mais cheia é a de 0,6–0,7, com 21,66%.
Portanto uma cor RGB tirada ao acaso quase nunca é escura. A razão é que a luminosidade percebida não é linear nos valores dos canais: o cubo só chega a luminosidades baixas num cantinho junto ao preto, e todo o resto se amontoa na metade de cima. Amostrar 200 000 cores da forma ingénua deixa 0,00% na banda mais escura; amostrar uniformemente na luminosidade deixa 10,06%, e as dez bandas ficam entre 9,88% e 10,13%.
Conseguir essa distribuição uniforme dá mais trabalho do que parece, e o atalho óbvio não a consegue. Extrair uniformemente de uma caixa num espaço percetual e deitar fora o que fica fora do sRGB rejeita 21,8% das extrações — mas não por igual, porque a gama é estreita junto ao preto e ao branco. Isso empurra os sobreviventes de volta para o meio, que é exatamente o enviesamento que a amostragem percetual queria retirar: medido, ficava apenas 1,36 vezes mais plano do que o cubo em bruto. A solução é escolher primeiro uma luminosidade e um matiz, calcular quanta cor essa combinação concreta consegue mesmo suportar, e tirar a croma de dentro desse limite.
As paletas aleatórias chocam
Peça oito cores ao acaso e há 78,0% de probabilidade de duas ficarem a menos de 0,1 em Oklab. Com cinco cores são 41,2%; com doze, 97,5%.
Para dar ideia dessa distância: do preto ao branco vai 1,000, do vermelho ao verde 0,520, e dois hexadecimais consecutivos — #808080 e #818181 — estão a 0,0034. Um intervalo de 0,1 é pequeno o suficiente para que duas linhas de um gráfico pintadas com essas cores se confundam facilmente, que é precisamente a situação que uma legenda tem de aguentar.
A definição de separação resolve isto por rejeição: tira-se um candidato e, se estiver mais perto do que o limiar de alguma já escolhida, deita-se fora e tira-se outro. O painel por baixo das amostras indica o par mais próximo do lote que obteve, pelo que a garantia vê-se em vez de ser afirmada.
Limitações assumidas
Uma separação grande e um número grande nem sempre são compatíveis. Na gama sRGB só cabe uma certa quantidade, e pedir vinte cores todas a 0,15 de distância acaba por ser impossível. Quando o orçamento de rejeições se esgota, a ferramenta completa o lote na mesma e di-lo: devolver menos cores do que as pedidas, ou ficar em ciclo, seriam ambas piores do que admitir que a restrição foi largada.
A distância é uma reta em Oklab, que é uma boa medida percetual mas não uma afirmação sobre os seus olhos. O Oklab foi desenhado para que distâncias iguais pareçam diferenças semelhantes, e é o que o CSS usa hoje, mas um limiar de 0,1 é uma definição desta página e não uma norma: por isso o artigo lhe dá as referências acima em vez de afirmar um limiar de perceção que esta página não mediu.
A aleatoriedade vem de um gerador com semente, pequeno e não criptográfico. É propositado: torna cada lote reproduzível e permite que os testes verifiquem distribuições. Se precisa de valores imprevisíveis para algo que conte, o gerador de palavras-passe deste site usa a fonte criptográfica do navegador.
Nada disto tem em conta as deficiências da visão das cores. Duas cores podem estar bem separadas em Oklab e ainda assim confundir-se para quem tem uma deficiência vermelho-verde, porque a distância é calculada para uma visão tricromática típica. Uma paleta que tenha de funcionar para toda a gente precisa de ser verificada especificamente para isso.
Quarenta verificações cobrem a distribuição contada exaustivamente, as taxas de colisão, a procura do limite da gama, a garantia de separação e a uniformidade do gerador com semente.
Porque é gratuito
É aritmética e um número ao acaso, a correr no seu navegador. Nada é enviado, não há conta e não há limite de lotes.
Se o que quer é uma cor específica e não uma ao acaso, o seletor de cores e os conversores hexadecimais deste site são igualmente gratuitos e igualmente locais.