103 votes

Conversion d'un tuple de couleur RVB en un code à six chiffres

Je dois convertir (0, 128, 64) à quelque chose comme ceci "#008040" . Je ne sais pas comment appeler ce dernier, ce qui rend la recherche difficile.

1 votes

Voir la réponse précédente de SO stackoverflow.com/questions/214359/ --Parmi les trois réponses, celle qui a reçu le plus de votes comprend un extrait de code python pour faire ce que je crois que vous recherchez.

3 votes

Le terme que vous recherchez est Hex Triplet. fr.wikipedia.org/wiki/Hex_color#Hex_triplet

0 votes

Pour une question plus générale, avec des réponses bien meilleures qu'ici : stackoverflow.com/a/57197866/624066

217voto

Dietrich Epp Points 72865

Utilisez l'opérateur de format % :

>>> '#%02x%02x%02x' % (0, 128, 64)
'#008040'

Notez qu'il ne vérifiera pas les limites...

>>> '#%02x%02x%02x' % (0, -1, 9999)
'#00-1270f'

0 votes

La limite à deux chiffres est-elle vraiment nécessaire ? Tant que les valeurs RVB sont dans les limites appropriées de 0-255, vous ne devriez pas en avoir besoin. Vous pouvez donc simplement faire '#%x%x%x' % (r, g, b)

3 votes

En fait, je vois maintenant que si vous avez une valeur de 0, elle doit être complétée par un autre 0. D'où le 02 pour en faire deux chiffres.

62voto

Jesse Dhillon Points 4136
def clamp(x): 
  return max(0, min(x, 255))

"#{0:02x}{1:02x}{2:02x}".format(clamp(r), clamp(g), clamp(b))

Cette méthode utilise la méthode préférée de formatage des chaînes de caractères. décrite dans le document PEP 3101 . Il utilise également min() y max afin de garantir que 0 <= {r,g,b} <= 255 .

Mise à jour a ajouté la fonction de serrage comme suggéré ci-dessous.

Mise à jour D'après le titre de la question et le contexte donné, il devrait être évident que cette fonction attend 3 ints dans [0,255] et renvoie toujours une couleur lorsqu'on lui passe 3 ints. Cependant, d'après les commentaires, il se peut que cela ne soit pas évident pour tout le monde, donc il faut le dire explicitement :

Fourni trois int cela renverra un triplet hexagonal valide représentant une couleur. Si ces valeurs sont comprises entre [0 et 255], il les traitera comme des valeurs RVB et renverra la couleur correspondant à ces valeurs.

21voto

Thomas Cokelaer Points 859

C'est une vieille question mais pour information, j'ai développé un paquet avec quelques utilitaires liés aux couleurs et colormaps et contient la fonction rgb2hex que vous cherchiez pour convertir les triplets en valeur hexa (qui peut être trouvée dans beaucoup d'autres paquets, par exemple matplotlib). C'est sur pypi

pip install colormap

et ensuite

>>> from colormap import rgb2hex
>>> rgb2hex(0, 128, 64)
'##008040'

La validité des entrées est vérifiée (les valeurs doivent être comprises entre 0 et 255).

3 votes

J'ai essayé d'utiliser rgb2hex mais j'ai obtenu une erreur "ImportError : No module named easydev.tools". Pouvez-vous me suggérer une solution ?

0 votes

Essayez de réinstaller easydev. Puis "pip3 install easydev".

18voto

Mohd Shibli Points 574

J'ai créé un programme python complet pour cela les fonctions suivantes peuvent convertir rgb en hex et vice versa.

def rgb2hex(r,g,b):
    return "#{:02x}{:02x}{:02x}".format(r,g,b)

def hex2rgb(hexcode):
    return tuple(map(ord,hexcode[1:].decode('hex')))

Vous pouvez voir le code complet et le tutoriel au lien suivant : Conversion de RGB en Hex et de Hex en RGB à l'aide de Python

0 votes

Il ne fonctionne pas pour les valeurs décimales de rgb. Pouvez-vous me suggérer une solution ?

0 votes

Ronde. Il ne devrait pas y avoir une grande différence dans la couleur finale.

10voto

gnibbler Points 103484
triplet = (0, 128, 64)
print '#'+''.join(map(chr, triplet)).encode('hex')

ou

from struct import pack
print '#'+pack("BBB",*triplet).encode('hex')

python3 est légèrement différent

from base64 import b16encode
print(b'#'+b16encode(bytes(triplet)))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X