Created
December 13, 2021 01:24
-
-
Save becker990/40852f5709eae2cb3f8f5cff698bb3af to your computer and use it in GitHub Desktop.
Converts a color from RGB to HSL
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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