Travailler sur la réponse de Jeremy ici: Conversion de la couleur hexadécimale en RVB et vice-versa J'ai pu obtenir un programme python pour convertir les codes hexadécimaux de couleur prédéfinie (exemple # B4FBB8) Cependant, du point de vue de l'utilisateur final, nous ne pouvons pas demander aux utilisateurs de modifier le code et de l'exécuter à partir de là.
Voici le code que j'ai jusqu'à présent:
def hex_to_rgb(value):
value = value.lstrip('#')
lv = len(value)
return Tuple(int(value[i:i + lv // 3], 16) for i in range(0, lv, lv // 3))
def rgb_to_hex(rgb):
return '#%02x%02x%02x' % rgb
hex_to_rgb("#ffffff") # ==> (255, 255, 255)
hex_to_rgb("#ffffffffffff") # ==> (65535, 65535, 65535)
rgb_to_hex((255, 255, 255)) # ==> '#ffffff'
rgb_to_hex((65535, 65535, 65535)) # ==> '#ffffffffffff'
print('Please enter your colour hex')
hex == input("")
print('Calculating...')
print(hex_to_rgb(hex()))
En utilisant la ligne print(hex_to_rgb('#B4FBB8'))
, je peux l’obtenir de la bonne valeur RVB qui est (180, 251, 184)
C'est probablement très simple - je suis encore assez brouillon avec Python.
Je crois que cela fait ce que vous recherchez:
h = input('Enter hex: ').lstrip('#')
print('RGB =', Tuple(int(h[i:i+2], 16) for i in (0, 2, 4)))
(Ce qui précède a été écrit pour Python 3)
Échantillon échantillon:
Enter hex: #B4FBB8
RGB = (180, 251, 184)
Pour écrire dans un fichier avec le handle fhandle
tout en préservant le formatage:
fhandle.write('RGB = {}'.format( Tuple(int(h[i:i+2], 16) for i in (0, 2, 4)) ))
Une option paresseuse: webcolors Le paquet a un hex_to_rgb
une fonction.
Il y a deux petites erreurs ici!
hex == input("")
Devrait être:
user_hex = input("")
Vous voulez affecter la sortie de input()
à hex
, sans vérifier la comparaison. De plus, comme mentionné dans les commentaires (@koukouviou), ne remplacez pas hex
, appelez-le plutôt comme user_hex
.
Également:
print(hex_to_rgb(hex()))
Devrait être:
print(hex_to_rgb(user_hex))
Vous voulez utiliser la valeur hexadécimale, pas la méthode appelable du type (__call__
).
Toutes les réponses que j'ai vues impliquent la manipulation d'une chaîne hexagonale. À mon avis, je préférerais travailler avec des entiers codés et les triplets RVB eux-mêmes, pas seulement des chaînes. Cela a l'avantage de ne pas nécessiter qu'une couleur soit représentée en hexadécimal - cela pourrait être en octal, binaire, décimal, et ainsi de suite.
Convertir un triple RVB en un entier est facile.
rgb = (0xc4, 0xfb, 0xa1) # (196, 251, 161)
def rgb2int(r,g,b):
return (256**2)*r + 256*g + b
c = rgb2int(*rgb) # 12909473
print(hex(c)) # '0xc4fba1'
Nous avons besoin d'un peu plus de maths pour la direction opposée. J'ai soulevé ce qui suit de ma réponse à un semblable question d'échange mathématique .
c = 0xc4fba1
def int2rgb(n):
b = n % 256
g = int( ((n-b)/256) % 256 ) # always an integer
r = int( ((n-b)/256**2) - g/256 ) # ditto
return (r,g,b)
print(Tuple(map(hex, int2rgb(c)))) # ('0xc4', '0xfb', '0xa1')
Avec cette approche, vous pouvez facilement convertir des chaînes.
la version floats:
def hextofloats(h):
return [int(h[i:i + 2], 16) / 255. for i in (1, 3, 5)] # skip '#'
def floatstohex(rgb):
return f'#{int(rgb[0]*255):02x}{int(rgb[1]*255):02x}{int(rgb[2]*255):02x}'