web-dev-qa-db-fra.com

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

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.

61
rectangletangle

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'
138
Dietrich Epp
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.

43
Jesse Dhillon

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

16
Thomas Cokelaer

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

8
Mohd Shibli
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)))
7
John La Rooy
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 :-)

2
MikeyB

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

2
Kaneki

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))
1
Richard

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)
1
toto_tico

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
0
Brian Bruggeman