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

9voto

MestreLion Points 1789

Je suis vraiment surpris que personne n'ait suggéré cette approche :

Pour Python 2 et 3 :

'#' + ''.join('{:02X}'.format(i) for i in colortuple)

Python 3.6+ :

'#' + ''.join(f'{i:02X}' for i in colortuple)

En tant que fonction :

def hextriplet(colortuple):
    return '#' + ''.join(f'{i:02X}' for i in colortuple)

color = (0, 128, 64)
print(hextriplet(color))

#008040

5voto

Kaneki Points 29

Vous pouvez utiliser lambda et f-strings (disponible dans 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))

utilisation

rgb2hex(r,g,b) #output = #hexcolor hex2rgb("#hex") #output = (r,g,b) hexcolor must be in #hex format

1 votes

Appeler directement des lambdas n'est pas recommandé pour une foule de raisons. Je les ai utilisés comme ça sur un projet qui a été revu et tout le monde a dit la même chose, de ne pas appeler directement.

4voto

Richard Points 5991

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 gamme [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))

0 votes

C'est génial ! Une fonction vraiment générique. Merci, Richard !

4voto

Brian Bruggeman Points 584

Notez que cela ne fonctionne qu'avec python3.6 et plus.

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 votes

Cette fonction rgb2hex, appliquée à (13,13,12), donne 0xDDC, mais le site RGB to HEX le donne comme 0x0D0D0C, et cela concorde aussi avec l'idée que le nombre devrait être 13*65536+13*256+12, et 0xDDC est lu par Python comme 3548.

0 votes

Les couleurs CSS sont incohérentes. Il existe des couleurs hexadécimales à 6 chiffres, des couleurs hexadécimales à 3 chiffres, la notation rgb avec décimales et pourcentages, hsl, etc. J'ai modifié la formule afin de toujours fournir des couleurs hexadécimales à 6 chiffres, et bien que je pense que cela soit plus cohérent, je ne suis pas sûr que ce soit plus correct.

3voto

toto_tico Points 2014

En Python 3.6 vous pouvez utiliser Cordes en F pour rendre cela plus propre :

rgb = (0,128, 64)
f'#{rgb[0]:02x}{rgb[1]:02x}{rgb[2]:02x}'

Bien sûr, vous pouvez mettre cela dans un fonction et en prime, 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)

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