Question 147

Comment convertir une valeur long en RGB ?

Les couleurs Windows sont représentés par un entier long (8 bytes). Cet entier long permet de stocker les composantes RVB (Rouge, Vert et Bleu) de la façon suivante : &H00BBVVRR. On remarquera que les valeurs pour R, V et B sont stockés dans l'ordre B, V, R, contrairement à HTML, par exemple, où les valeurs sont stockés dans l'ordre R, V, B.

La fonction RGB(r,v,b) produit un entier long (Long) suivant la formule :

    lColorValue = 65536 * b + 256 * v + r

Pour retrouver les valeurs r,v et b depuis un Long, il suffit de procéder à l'opération inverse :

    b = lColorValue \ 65536
    v = lColorValue \ 256 And &HFF
    r = lColorValue And &HFF

On peut écrire une Sub qui implémente ceci :

Public Sub MyGetRVB(ByVal lColorValue As Long, _
                    ByRef r As Integer, _
                    ByRef v As Integer, _
                    ByRef b As Integer)
     
    b = lColorValue \ 65536
    v = lColorValue \ 256 And &HFF
    r = lColorValue And &HFF
End Sub

On peut remarquer que les formules utilisées pour retrouver les composantes RVB ne font appel qu'à des divisions entières par des mulitples de 2 (ce qui revient à un simple décalage binaire vers la droite) et à des opérations binaires de "masquage" de bits. Ces 2 opérations sont extrèmement rapides car elles se traduisent par des instructions élémentaires du processeur.
Informations complémentaires
Dans l'entier long représentant la couleur, l'octet de poids le plus fort vaut "0x00" pour les couleurs utilisateurs. La valeur "0x80" est réservée pour indiquer une couleur système; dans ce cas, l'octet de poids le plus faible indique l'élément Windows concerné.
Visual Basic possède une énumération de constantes (system colors) qui permet de retrouver la plupart de ces couleurs système. Néanmoins, l'arrivée de Windows XP et ensuite de Windows Vista a aussi été l'occasion d'introduire de nouveaux code couleurs système. Ceux-ci ne sont pas disponibles directement, et devront être obtenus à partir de la fonction getSysColor, qui renverra elle une couleur utilisateur.
Liens utiles
Date de publication : 25 février 2007
Dernière modification : 25 février 2007
Rubriques : Affichage & graphismes
Mots-clés : RGB, couleurs, conversion, rouge, vert, bleu