web-dev-qa-db-fra.com

Conversion de la valeur Hex en RVB en Python

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.

38
Julian White

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)

Ecrire dans un fichier

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)) ))
82
John1024

Une option paresseuse: webcolors Le paquet a un hex_to_rgb une fonction.

11
vwrobel

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__).

2
Matt Davidson

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.

0
terrygarcia

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}'
0
roberto