Code couleur GDI+

Résolu
cs_jacques13 Messages postés 252 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 29 juin 2013 - 6 janv. 2007 à 21:02
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 - 8 janv. 2007 à 14:49
Bonjour,
Je cherche la passerelle entre l'entier long codant les couleurs en VB6 et l'entier long qui code les couleurs avec les fonctions de GDI+
Jacques13
A voir également:

17 réponses

Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
6 janv. 2007 à 23:17
voila je viens de réfléchir, il y a bien une petite astuce:


arg = &HFF000000 Or RGB(B, V, R)

j'ai bien mis Bleu, Vert, Rouge  (et non pas Rouge,Vert, Bleu comme dans la fonction normale RGB)

MsgBox Hex$(16776960) --> &HFFFF00
en GDI+ ça donne &HFF00FFFF

Daniel
3
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
6 janv. 2007 à 21:24
Je comprends mal ta question.
T'est-il possible de la reformuler avec plus de précision ?
0
cs_jacques13 Messages postés 252 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 29 juin 2013
6 janv. 2007 à 21:42
Si l'on prend l'exemple de la couleur noire : en VB classique son code entier long est de 0& (RGB(0,0,0)=0& ou VbBlack=0&) en revanche le code entier long du noir en programmation GDI+ est de -16777216.
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
6 janv. 2007 à 21:45
Ben c'est le même non ?

Au pire y'a peut-être l'ajout de la composante alpha ?
Si oui alors c'est simple :
Les couleurs sont codées en base 256 donc quand tu as une couleur donnée par RGB
Il fait en fait le simple calcul
Couleur = R + G * 256 + B * 256 * 256
Et si tu veux ajouter la composante alpha, tu ajoute A * 256 ^ 3 à ton nombre fourni par RGB...

Julien.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
6 janv. 2007 à 21:49
Salut,

Private Type COLORBYTES
   BlueByte As Byte
   GreenByte As Byte
   RedByte As Byte
   AlphaByte As Byte
End Type

Private Type COLORLONG
   longval As Long
End Type

Private Type RGBQUAD
   rgbBlue As Byte
   rgbGreen As Byte
   rgbRed As Byte
   rgbReserved As Byte
End Type

Private Function ColorARGB(ByVal alpha As Byte, ByVal Red As Byte, ByVal Green As Byte, ByVal Blue As Byte) As Long
   Dim bytestruct As COLORBYTES
   Dim result As COLORLONG
   With bytestruct
      .AlphaByte = alpha
      .RedByte = Red
      .GreenByte = Green
      .BlueByte = Blue
   End With
   LSet result = bytestruct
   ColorARGB = result.longval
End Function

Private Declare Function CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Dest As Any, Src As Any, ByVal cb As Long) As Long

Private Function GetRGB_VB2GDIP(ByVal lColor As Long, Optional ByVal alpha As Byte = 255) As Long
   Dim rgbq As RGBQUAD
   CopyMemory rgbq, lColor, 4
   GetRGB_VB2GDIP = ColorARGB(alpha, rgbq.rgbBlue, rgbq.rgbGreen, rgbq.rgbRed)
End Function

- mais il y a plus simple, si tu prend pas en compte l'alpha:
    ColorGDI = &HFF000000 or ColorVB
- et en prenant en compte les composantes couleurs ça donne:
    ColorGDI = &HFF000000 or RGB(Bleu,Vert,Rouge)

Daniel
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
6 janv. 2007 à 21:50
Un négatif ??? Ca c'est pas normal... Tu remarqueras que c'est le correspondant de l'hexadécimal bien rond : 01 00 00 00
Donc si on prends en compte l'alpha on a
A = 1 (pouvant aller de 0 à 255, c'est un gris très foncé ton noir...)
R, G, B = 0
Normal pour du noir...
Et si tu mets A = 0 c'est encore plus noir !
Essaye...

Julien.
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
6 janv. 2007 à 21:55
Juste une petite preuve de la justesse de la réponse que t'a faite Julien :

Private Declare Function TranslateColor Lib "olepro32.dll" Alias "OleTranslateColor" (ByVal clr As OLE_COLOR, ByVal palet As Long, col As Long) As Long
Private Sub Form_Load()
    TranslateColor Me.BackColor, 0, -16777216
    MsgBox "R=" + CStr(RealColor And &HFF&) + " G=" + CStr((RealColor And &HFF00&) / 2 ^ 8) + " B=" + CStr((RealColor And &HFF0000) / 2 ^ 16)
End Sub
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
6 janv. 2007 à 21:59
note:
-16777216 = &HFF000000
soit &HFF000000 or RGB (0,0,0)

Daniel
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
6 janv. 2007 à 22:02
Excuse ! je me suis trompé en écrivant TROP vite !
On recommence :

Private Declare Function TranslateColor Lib "olepro32.dll" Alias "OleTranslateColor" (ByVal clr As OLE_COLOR, ByVal palet As Long, col As Long) As Long
Private Sub Form_Load()
    Dim RealColor As Long
   TranslateColor -16777216, 0, RealColor
    MsgBox "The backcolor of this form is R=" + CStr(RealColor And &HFF&) + " G=" + CStr((RealColor And &HFF00&) / 2 ^ 8) + " B=" + CStr((RealColor And &HFF0000) / 2 ^ 16)
End Sub




 
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
6 janv. 2007 à 22:19
Salut,

ça prouve rien puisqu'une couleur pour GDI+ n'est pas une OLE_COLOR
c'est comme une couleur VB auquelle on ajoute l'alpha
soit en hexa de la forme &HAABBVVRR
avec A pour alpha, B pour bleu, V pour vert, R pour rouge
à partir du moment ou l'alpha dépasse 127 (&H7F) on a bien du négatif

Daniel
0
cs_jacques13 Messages postés 252 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 29 juin 2013
6 janv. 2007 à 22:22
Merci à tous ceux qui ont pris la peine de répondre à ma question.
Je m'aperçois que j'ai été bien peu clair en la formulant et surtout en prenant cet exemple idiot du noir.
En fait, avant de me lancer dans le dessin assisté de la bibliothèque GDI+, j'utilisais la fonction classique de GDI: Polygon qui me permettait de teinter des polygones avec certaines couleurs prédéfinies par exemple 16776960 pour obtenir un bleu clair ou 8421631 pour obtenir un orange brique. Depuis mon passage en GDI+ je suis bien emm... pour réutiliser ces couleurs qui ne correspondent plus à rien!
Je pensais pouvoir récupérer une fonction très simple assurant le passage d'une codification à l'autre; je pense que les différences doivent provenir de la composante alpha qu'il faut réintroduire quelque part.
Jacques13
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
6 janv. 2007 à 22:28
en mettant les couleurs en hexa on voit tout de suite plus clair:

MsgBox Hex$(16776960) --> &HFFFF00
soit Bleu=255, Vert=255, Rouge=0   (correspond à du cyan)

en GDI+ ça donne &HFFFFFF00   (-256)

Daniel
0
cs_jacques13 Messages postés 252 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 29 juin 2013
6 janv. 2007 à 22:59
Ta réponse, Gobillot, me plait bien, malheureusement le &HFFFFFF00 me produit du jaune!!!
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
6 janv. 2007 à 23:15
Jaune ? Jaune c'est Red = 255 Green = 255 et Blue = 0
Tes couleurs seraient donc codées dans un autre ordre ?

Ca me dit quelque chose... Je suis sûr d'avoir déjà vu ca quelque part...
Je crois que quand j'étais en VB6 et que j'utilisais Dx 8, je devais faire ce genre de traduction...

Les deux standards seraient-ils (dans l'ordre de codage) RGB et ABGR ?

Vérification rapide dans l'immediate de VB2005 avec Dx 9 :

?color.Black.ToArgb
-16777216
?color.Yellow.ToArgb
-256
?color.Red.ToArgb
-65536

Daniel > Autant pour moi pour les négatifs, je pense toujours les couleurs comme une somme de puissance de 256, mais quand on arrive au 32e bit, on change en effet de signe...

Julien.
0
cs_jacques13 Messages postés 252 Date d'inscription mardi 3 juin 2003 Statut Membre Dernière intervention 29 juin 2013
6 janv. 2007 à 23:28
OK! C'est paaaarfait!
Merci à tous et particulièrement à Julien et Gobillot.
Jacques13
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
8 janv. 2007 à 11:18
GDI+ introduit simplement le canal alpha.
par default, pour avoir els couleurs utilisée par VB6, et donc GDI, il suffit de placer l'octet correspondant à 255 (&hFF)

le plus efficace étant, comme l'indique Daniel, de faire un OR &hFF000000&

quant à se préoccuper du fait que cela produise un nombre négatif, ca révèle une méconnaissance de certaines choses. en fait, un nombre est considéré comme négatif lorsque le bit le plus fort (le plus a gauche) est a 1.
c'est le cas par exemple pour &HFF00FFFF

ensuite, dire si c'est négatif ou non, c'est une question de représentation, et de savoir si la zone est considéré comme étant signée ou non. En VB6, elles sont toujours signées, mais ca n'est pas toujours le cas. vu qu'il ne s'agit encore une fois que d'une représentation, rien de bien grave... les bits sont là ^^

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
8 janv. 2007 à 14:49
^^ Ben oui c'est ce que j'ai écris à la fin de mon précédant post...
Et il ne suffit pas de faire OR &hFF000000&, puisqu'il faut aussi inverser le bleu et le rouge...

Julien.
0
Rejoignez-nous