54 votes

Conversion d'une couleur hexagonale en RVB et vice-versa

Quel est le moyen le plus efficace de le faire ?

15 votes

Vous devriez peut-être définir la langue. Cela fera une différence dans l'algorithme choisi.

179voto

Jeremy Cantrell Points 7858

En python :

def hex_to_rgb(value):
    """Return (red, green, blue) for the color given as #rrggbb."""
    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(red, green, blue):
    """Return color as #rrggbb for the given color values."""
    return '#%02x%02x%02x' % (red, green, blue)

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'

1 votes

Pourriez-vous expliquer ce qui se passe dans le formatage pour rbg_to_hex ?

2 votes

Dans la fonction, rgb est un tuple de 3 ints. Cette chaîne de format est juste un # suivi de trois %02x qui donnent juste une valeur hexadécimale à deux chiffres, remplie de zéro, pour l'entier.

5 votes

J'ai posté ceci il y a longtemps et c'est toujours l'un de mes morceaux de code python préférés (que j'ai écrit).

19voto

Bill James Points 7554

Juste très rapidement :

int r = ( hexcolor >> 16 ) & 0xFF;

int g = ( hexcolor >> 8 ) & 0xFF;

int b = hexcolor & 0xFF;

int hexcolor = (r << 16) + (g << 8) + b;

2 votes

Attention à la précédence de vos opérateurs : + a une priorité plus élevée que <<

1 votes

Joli La réponse est là depuis un an et demi et personne n'a vu ça.

0 votes

Hum... si int est de 16 bits, le rouge est décalé vers le seau de bits.

10voto

Vicent Marti Points 2942

La vraie réponse : Cela dépend du type de valeur hexadécimale de la couleur que vous recherchez (par exemple 565, 555, 888, 8888, etc.), du nombre de bits alpha, de la distribution réelle de la couleur (rgb vs bgr...) et d'une tonne d'autres variables.

Voici un algorithme générique pour la plupart des valeurs RVB utilisant des modèles C++ (directement issus de ScummVM).

template<class T>
uint32 RGBToColor(uint8 r, uint8 g, uint8 b) {
return T::kAlphaMask |
       (((r << T::kRedShift) >> (8 - T::kRedBits)) & T::kRedMask) |
       (((g << T::kGreenShift) >> (8 - T::kGreenBits)) & T::kGreenMask) |
       (((b << T::kBlueShift) >> (8 - T::kBlueBits)) & T::kBlueMask);
}

Voici un exemple de structure de couleur pour 565 (le format standard pour les couleurs 16 bits) :

template<>
struct ColorMasks<565> {
enum {
    highBits    = 0xF7DEF7DE,
    lowBits     = 0x08210821,
    qhighBits   = 0xE79CE79C,
    qlowBits    = 0x18631863,

    kBytesPerPixel = 2,

    kAlphaBits  = 0,
    kRedBits    = 5,
    kGreenBits  = 6,
    kBlueBits   = 5,

    kAlphaShift = kRedBits+kGreenBits+kBlueBits,
    kRedShift   = kGreenBits+kBlueBits,
    kGreenShift = kBlueBits,
    kBlueShift  = 0,

    kAlphaMask = ((1 << kAlphaBits) - 1) << kAlphaShift,
    kRedMask   = ((1 << kRedBits) - 1) << kRedShift,
    kGreenMask = ((1 << kGreenBits) - 1) << kGreenShift,
    kBlueMask  = ((1 << kBlueBits) - 1) << kBlueShift,

    kRedBlueMask = kRedMask | kBlueMask

};
};

7voto

Rrrrrrrrrk Points 593

Modification de la réponse python de Jeremy pour gérer les valeurs rgb CSS courtes comme 0, #999, et #fff (que les navigateurs rendraient comme noir, gris moyen, et blanc) :

def hex_to_rgb(value):
    value = value.lstrip('#')
    lv = len(value)
    if lv == 1:
        v = int(value, 16)*17
        return v, v, v
    if lv == 3:
        return tuple(int(value[i:i+1], 16)*17 for i in range(0, 3))
    return tuple(int(value[i:i+lv/3], 16) for i in range(0, lv, lv/3))

2voto

Jeremy Ruten Points 59989

Une valeur hexadécimale est simplement un nombre RVB représenté en hexadécimal. Il suffit donc de prendre chaque paire de chiffres hexadécimaux et de les convertir en décimal.

Exemple :

#FF6400 = RGB(0xFF, 0x64, 0x00) = RGB(255, 100, 0)

0 votes

Il a écrit une équation. RVB vers hex, c'est lire de droite à gauche. Hex vers RGB, c'est lire de gauche à droite.

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