Skip to content

Instantly share code, notes, and snippets.

@becker990
Created December 13, 2021 01:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save becker990/40852f5709eae2cb3f8f5cff698bb3af to your computer and use it in GitHub Desktop.
Save becker990/40852f5709eae2cb3f8f5cff698bb3af to your computer and use it in GitHub Desktop.
Converts a color from RGB to HSL
def converte_hex_para_hsl(hexstring : str):
import colorsys
# especificacao do formato retirada de
# https://en.wikipedia.org/wiki/Web_colors
# tamanho da string
CONST_FULLSIZE = 7
CONST_MINSIZE = 4
CONST_STARTS = '#'
# verifica que temos uma string
# dentro do formato esperado
if (len(hexstring) != CONST_FULLSIZE and len(hexstring) != CONST_MINSIZE):
raise ValueError("String HEX fora de formato 1 " + hexstring)
if (hexstring[0] != CONST_STARTS):
raise ValueError("String HEX fora de formato 3 " + hexstring)
# remove o simbolo inicial
hexstring = hexstring[1:]
# verifica se eh shorthand
# se eh curto faz um padding
if(len(hexstring) == CONST_MINSIZE - 1):
hexstring = hexstring[0] * 2 + hexstring[1] * 2 + hexstring[2] * 2
# separamos os tres canais
# e convertemos para rgb
# EM FLOAT DE 0 a 1
try:
r = int(hexstring[0:2], 16) / 255.0
g = int(hexstring[2:4], 16) / 255.0
b = int(hexstring[4:6], 16) / 255.0
except ValueError as e:
raise ValueError("String HEX fora de formato 4 " + hexstring)
# convertemos usando a lib
hls = colorsys.rgb_to_hls(r, g, b)
# separamos os canais
# atentar a ordem aqui
hue = hls[0]
saturation = hls[2]
luminosity = hls[1]
# corrigimos a formatacao vinda
# da biblioteca padrao
# convertemos de float para graus
# no disco de cores
hue = round(hue * 360)
#convertemos de float para porcento
saturation = round(saturation * 100)
luminosity = round(luminosity * 100)
# string e sinais de porcento
hue = str(hue)
saturation = f'{str(saturation)}%'
luminosity = f'{str(luminosity)}%'
return f'hsl({hue}, {saturation}, {luminosity})'
def main():
print("Testes...")
# ValueError exceptions
valuerrors = []
valuerrors.append("asdasdadads")
valuerrors.append("asd")
valuerrors.append("abc")
valuerrors.append("aabbcc")
valuerrors.append("#f00c")
valuerrors.append("#zzzzzz")
valuerrors.append("#zzz")
valuerrors.append("#zfc")
valuerrors.append("#fzc")
valuerrors.append("#fcz")
valuerrors.append("#ffcczz")
valuerrors.append("#ffzzcc")
valuerrors.append("#ffcczz")
# assertivos
asserts = []
asserts.append(["#aabbcc", "hsl(210, 25%, 73%)"])
asserts.append(["#abc", "hsl(210, 25%, 73%)"])
asserts.append(["#000", "hsl(0, 0%, 0%)"])
asserts.append(["#000000", "hsl(0, 0%, 0%)"])
asserts.append(["#ffffff", "hsl(0, 0%, 100%)"])
asserts.append(["#fff", "hsl(0, 0%, 100%)"])
for caso in valuerrors:
try:
c = converte_hex_para_hsl(caso)
except ValueError as e:
print("caso " + caso + " OK")
pass
else:
print("erro no caso " + caso)
exit
for caso in asserts:
c = converte_hex_para_hsl(caso[0])
print("caso " + caso[0] + " OK")
assert(c == caso[1]), "Erro no caso " + caso[0]
print("Testes OK")
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment