Quel est le moyen le plus efficace de le faire ?
Pourriez-vous expliquer ce qui se passe dans le formatage pour rbg_to_hex
?
Quel est le moyen le plus efficace de le faire ?
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'
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.
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).
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
};
};
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))
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.
15 votes
Vous devriez peut-être définir la langue. Cela fera une différence dans l'algorithme choisi.