O principal objetivo do modelo de cores RGB (vermelho verde azul) é detectar, representar e exibir imagens em sistemas eletrônicos, como televisores e computadores
HSL (Hue Saturation Lightness) é um modelo de cor alternativo, projetado na década de 1970 por pesquisadores de computação gráfica para se alinhar mais de perto com a maneira como a visão humana percebe atributos de produção de cores
Aqui estão os artigos do wiki para RGB e HSL . É comum que programas gráficos façam os cálculos em HSL e depois convertam para o formato preferido para a maioria das telas: RGB.
A tarefa é escrever uma função / programa que aceite HSL como entrada e produza RGB.
Você pode escolher sua representação preferida para E / S, desde que consistente entre elas.
Por exemplo, eles podem ser um array / tupla com 3 elementos ou um objeto com 3 propriedades nomeadas h
, s
e l
, mas eu vou aceitar outras variações inteligentes, como receber o HSL como um inteiro (precisão perder) e produzir um inteiro rgb.
A entrada pode ser considerada segura no intervalo e no formato, os quais você pode decidir. Eu sugiro fortemente os intervalos 0-1 0-1 0-1
ou 0-360 0-100 0-100
para hsl e / 0-1 0-1 0-1
ou 0-255 0-255 0-255
rgb.
Cada resposta é necessária para especificar as duas opções acima e coloque várias variações em suas respostas se você estiver particularmente orgulhoso delas, mesmo que elas não tenham menos caracteres que suas outras variações. Coloque o menor por cima.
Casos de pseudo teste para 0-360 0-100 0-100
→0-255 0-255 0-255
h s l → r g b
0 0 0 → 0 0 0
90 56 17 → 43 68 19
202 19 39 → 81 104 118
72 55 26 → 88 103 30
As fórmulas para a conversão podem ser encontradas aqui :
Essa é uma boa maneira de visualizar a conversão:
fonte
H
of0-360
é[0,360)
: seria melhor escrito como0-359
?a-b
notação é errada por si só ao lidar com valores não inteiros, mas eu diria que não há problema em manter a pergunta mais legível. Se alguém reclamar, eu vou repensar, então obrigado por apontar isso[0,360)
então :)Respostas:
JavaScript (ES6),
989594 bytesToma H em [0,360) e S / L em [0,1) . Emite R , G e B como uma matriz de 3 flutuadores em [0,1) .
Casos de teste
Esse snippet converte os resultados novamente em [0,255] .
Mostrar snippet de código
Quão?
Código de inicialização
Código principal
Permutações de (0, C, X)
A parte um pouco complicada é gerar a permutação correta de (0, C, X) de acordo com o ângulo do componente de matiz. Conforme mostrado na figura a seguir, cada valor da coluna é selecionado na mesma sequência de ciclo do período 6 , iniciando com diferentes compensações. No código acima, estamos usando - ~ H em vez de apenas + H porque precisamos coagir H a um número inteiro. Daí as compensações (5,3,1) em vez de (0,4,2) .
fonte
H
em[0,6)
e saída em[0,1]
salvar alguns bytes?Mathematica, 155 bytes
Experimente online!
fonte
Hue
é o HSB (AKA HSV) e não o HSL (veja as figuras 2a e 2b na página vinculada da Wikipedia).RGBColor
existe, masHSLColor
não existe . > _>Python 2 , 32 bytes
Experimente online!
Essa funcionalidade é realmente incorporada ao Python por
hls_to_rgb
dentro dacolorsys
biblioteca. O formato das entradas da mina é um intervalo 0-1 de HLS (em vez de HSL, ambos são acrônimos comuns para a mesma coisa [embora HSL seja mais comum]). E a mina gera valores RGB em uma tupla com um intervalo de 0 a 1.Créditos
Agradecemos a Jonathan Allan por apontar que eu só preciso importá-lo (e depois me ajudar a reduzir a contagem de bytes).
fonte
from colorsys import hls_to_rgb
uma vez que nos dá uma função que pode ser reutilizada. Editar - faça 21 comofrom colorsys import*
.import colorsys
por 15!C ++,
228221 bytes-7 bytes graças a Zacharý
Os argumentos são duas matrizes que têm um tamanho mínimo de 3 elementos (ou seja,
float hsl[3]
eint rgb[3]
OK. Agora, como isso funciona? O que é esse longo array?
Bem, não é uma matriz longa, é uma
int
matriz. Brincadeira à parte, a matriz indica em quantas posições trocamos CX e 0 quando queremos selecionar a permutação correta, + 2. Lembre-se de como R ', G' e B 'são selecionados?Digamos que temos uma ordem "normal" que é {C, X, 0}
Agora, quando a primeira permutação (por exemplo, {C, X, 0}) é selecionada, você não precisa mudar, o que é exatamente a mesma coisa que o deslocamento à direita por 0. Portanto, os três primeiros elementos da matriz são 0,0 e 0 0
Para a segunda permutação ({X, C, 0}), precisamos deslocar à direita C por 1, e deslocar à esquerda X por -1, para que o quarto, quinto e sexto elemento da matriz sejam 1, -1 e 0
E assim por diante...
No caso da 3ª e da 4ª permutação, preciso deslocar para a esquerda o 0 por 2, para a direita para -2. Como existem mais de 2 números negativos, prefiro adicionar 2 a cada elemento do array e subtrair 2 no tempo de execução (por razões de golfe, ter apenas números inteiros no array).
fonte
Python 2 ,
119112 bytesExperimente online!
Aceita entrada como
H=[0,6[, S=[0,1], L=[0,1]
fonte
HTML + JavaScript (ES6), 8 + 88 = 96 bytes
Toma a entrada como um ângulo e duas porcentagens. Estou marcando o snippet HTML
<p id=p>
e a função de seta JavaScript. Não sei o que os navegadores de arredondamento usam, portanto, minhas respostas podem diferir ligeiramente das suas.fonte
Swift 4, 218 bytes
Aceita valores HSL no intervalo [0,1] como argumentos e retorna uma matriz que contém os valores RGB no mesmo intervalo:
A idéia é primeiro converter a entrada de HSL para HSB e, em seguida, usar o construtor HSB do objeto de cor incorporado no Cocoa para recuperar os valores RGB.
A versão do UIKit tem exatamente o mesmo comprimento, pois as únicas substituições são:
Cocoa
→UIKit
NSColor
→UIColor
Ungolfed:
O seguinte fragmento pode ser usada para testar, por apenas substituindo os valores de
h
,s
el
:Infelizmente, não posso fornecer um link para uma sandbox on-line, pois todos eles rodam no Linux, o que não inclui o cacau.
fonte
GLSL (GL_ES)
160 144 134131 bytesMatiz está no intervalo de 0 a 6 (economiza 3 bytes)
Sat, luz e rgb são de 0 a 1
Experimente no livro de shaders
Utilizou a ferramenta colorpicker em uma tela de impressão para testar a saída correta,
exceto um pequeno erro em 202 19 39 → 81 104 118, que forneceu 80 104 118
fonte
R , 88 bytes
Experimente online!
Essa função usa como entrada os valores H, S e L como valores de 0-1 e varia os valores RGB como 0-255. Ele converte a representação HSL em uma representação HSV, depois usa
hsv()
para converter a representação HSV em uma cor R (ou seja, representação hexadecimal - #rrggbb) e depoiscol2rgb()
converte a cor R em valores RGB.fonte
Geléia ,
3932 bytes-1 graças a caird coinheringaahing (
%2
é apenasḂ
)-1 e / ou inspiração para -4 graças a caird coinheringaahing também!
Um programa completo com três argumentos de linha de comando:
L
,H
,S
Nas gamas de[0,1)
,[0,6)
e[0,1)
respectivamenteque imprime uma lista com o formato RGB como
[R, G, B]
com cada um dos três valores no intervalo[0,1]
Nota:
H
também pode quebrar como[0,360)
faria.Experimente online!
Quão?
fonte