J'ai besoin de convertir (0, 128, 64) quelque chose comme ceci # 008040. Je ne sais pas comment appeler ce dernier, ce qui rend la recherche difficile.
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'
def clamp(x):
return max(0, min(x, 255))
"#{0:02x}{1:02x}{2:02x}".format(clamp(r), clamp(g), clamp(b))
Ceci utilise la méthode préférée de formatage de chaîne, comme décrite dans PEP 3101 . Il utilise également min()
et max
pour garantir que 0 <= {r,g,b} <= 255
.
La 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 cela attend 3 ints dans [0,255] et retournera toujours une couleur lorsque passé 3 de ces ints. Cependant, d'après les commentaires, cela peut ne pas être évident pour tout le monde, alors qu'il soit explicitement déclaré:
Pourvu de trois valeurs
int
, cela retournera un triplet hexadécimal valide représentant une couleur. Si ces valeurs sont comprises entre [0,255], il les traitera comme des valeurs RVB et renverra la couleur correspondant à ces valeurs.
C'est une vieille question mais pour information, j'ai développé un package avec quelques utilitaires liés aux couleurs et aux palette de couleurs et contient la fonction rgb2hex que vous cherchiez à convertir le triplet en valeur hexa (que vous pouvez trouver dans de nombreux autres packages, par exemple matplotlib). C'est sur pypi
pip install colormap
et alors
>>> 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).
J'ai créé un programme complet python 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 sur le lien suivant: conversion RVB en hexadécimal et hexadécimal en RVB en utilisant Python
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)))
def RGB(red,green,blue): return '#%02x%02x%02x' % (red,green,blue)
background = RGB(0, 128, 64)
Je connais les one-liners en Python ne sont pas nécessairement regardés avec bonté. Mais il y a des moments où je ne peux pas résister à profiter de ce que l'analyseur Python ne permet pas. C'est la même réponse que la solution de Dietrich Epp (la meilleure), mais enveloppée dans une fonction d'une seule ligne. Alors, merci Dietrich!
Je l'utilise maintenant avec tkinter :-)
vous pouvez utiliser des chaînes lambda et f (disponibles en python 3.6+)
rgb2hex = lambda r,g,b: f"#{r:02x}{g:02x}{b:02x}"
hex2rgb = lambda hx: (int(hx[0:2],16),int(hx[2:4],16),int(hx[4:6],16))
usage
rgb2hex(r,g,b) #output = #hexcolor hex2rgb("#hex") #output = (r,g,b) hexcolor must be in #hex format
Voici une fonction plus complète pour gérer les situations dans lesquelles vous pouvez avoir des valeurs RVB dans la plage [0,1] ou la plage [0,255].
def RGBtoHex(vals, rgbtype=1):
"""Converts RGB values in a variety of formats to Hex values.
@param vals An RGB/RGBA Tuple
@param rgbtype Valid valus are:
1 - Inputs are in the range 0 to 1
256 - Inputs are in the range 0 to 255
@return A hex string in the form '#RRGGBB' or '#RRGGBBAA'
"""
if len(vals)!=3 and len(vals)!=4:
raise Exception("RGB or RGBA inputs to RGBtoHex must have three or four elements!")
if rgbtype!=1 and rgbtype!=256:
raise Exception("rgbtype must be 1 or 256!")
#Convert from 0-1 RGB/RGBA to 0-255 RGB/RGBA
if rgbtype==1:
vals = [255*x for x in vals]
#Ensure values are rounded integers, convert to hex, and concatenate
return '#' + ''.join(['{:02X}'.format(int(round(x))) for x in vals])
print(RGBtoHex((0.1,0.3, 1)))
print(RGBtoHex((0.8,0.5, 0)))
print(RGBtoHex(( 3, 20,147), rgbtype=256))
print(RGBtoHex(( 3, 20,147,43), rgbtype=256))
Dans Python 3.6, vous pouvez utiliser f-strings pour rendre ce nettoyeur:
rgb = (0,128, 64)
f'#{rgb[0]:02x}{rgb[1]:02x}{rgb[2]:02x}'
Bien sûr, vous pouvez mettre cela dans une fonction, et en bonus, les valeurs sont arrondies et converties en int:
def rgb2hex(r,g,b):
return f'#{int(round(r)):02x}{int(round(g)):02x}{int(round(b)):02x}'
rgb2hex(*rgb)
Notez que cela ne fonctionne qu'avec python3.6 et supérieur.
def rgb2hex(color):
"""Converts a list or Tuple of color to an RGB string
Args:
color (list|Tuple): the list or Tuple of integers (e.g. (127, 127, 127))
Returns:
str: the rgb string
"""
return f"#{''.join(f'{hex(c)[2:].upper():0>2}' for c in color)}"
Ce qui précède est l'équivalent de:
def rgb2hex(color):
string = '#'
for value in color:
hex_string = hex(value) # e.g. 0x7f
reduced_hex_string = hex_string[2:] # e.g. 7f
capitalized_hex_string = reduced_hex_string.upper() # e.g. 7F
string += capitalized_hex_string # e.g. #7F7F7F
return string