Code couleur GDI+ [Résolu]

cs_jacques13 252 Messages postés mardi 3 juin 2003Date d'inscription 29 juin 2013 Dernière intervention - 6 janv. 2007 à 21:02 - Dernière réponse : Julien237 884 Messages postés vendredi 3 novembre 2000Date d'inscription 3 mars 2009 Dernière intervention
- 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
Afficher la suite 

17 réponses

Répondre au sujet
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 6 janv. 2007 à 23:17
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Gobillot
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 6 janv. 2007 à 21:24
0
Utile
Je comprends mal ta question.
T'est-il possible de la reformuler avec plus de précision ?
Commenter la réponse de jmfmarques
cs_jacques13 252 Messages postés mardi 3 juin 2003Date d'inscription 29 juin 2013 Dernière intervention - 6 janv. 2007 à 21:42
0
Utile
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.
Commenter la réponse de cs_jacques13
Julien237 884 Messages postés vendredi 3 novembre 2000Date d'inscription 3 mars 2009 Dernière intervention - 6 janv. 2007 à 21:45
0
Utile
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.
Commenter la réponse de Julien237
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 6 janv. 2007 à 21:49
0
Utile
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
Commenter la réponse de Gobillot
Julien237 884 Messages postés vendredi 3 novembre 2000Date d'inscription 3 mars 2009 Dernière intervention - 6 janv. 2007 à 21:50
0
Utile
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.
Commenter la réponse de Julien237
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 6 janv. 2007 à 21:55
0
Utile
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
Commenter la réponse de jmfmarques
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 6 janv. 2007 à 21:59
0
Utile
note:
-16777216 = &HFF000000
soit &HFF000000 or RGB (0,0,0)

Daniel
Commenter la réponse de Gobillot
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 6 janv. 2007 à 22:02
0
Utile
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




 
Commenter la réponse de jmfmarques
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 6 janv. 2007 à 22:19
0
Utile
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
Commenter la réponse de Gobillot
cs_jacques13 252 Messages postés mardi 3 juin 2003Date d'inscription 29 juin 2013 Dernière intervention - 6 janv. 2007 à 22:22
0
Utile
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
Commenter la réponse de cs_jacques13
Gobillot 3140 Messages postés vendredi 14 mai 2004Date d'inscription 31 mars 2015 Dernière intervention - 6 janv. 2007 à 22:28
0
Utile
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
Commenter la réponse de Gobillot
cs_jacques13 252 Messages postés mardi 3 juin 2003Date d'inscription 29 juin 2013 Dernière intervention - 6 janv. 2007 à 22:59
0
Utile
Ta réponse, Gobillot, me plait bien, malheureusement le &HFFFFFF00 me produit du jaune!!!
Commenter la réponse de cs_jacques13
Julien237 884 Messages postés vendredi 3 novembre 2000Date d'inscription 3 mars 2009 Dernière intervention - 6 janv. 2007 à 23:15
0
Utile
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.
Commenter la réponse de Julien237
cs_jacques13 252 Messages postés mardi 3 juin 2003Date d'inscription 29 juin 2013 Dernière intervention - 6 janv. 2007 à 23:28
0
Utile
OK! C'est paaaarfait!
Merci à tous et particulièrement à Julien et Gobillot.
Jacques13
Commenter la réponse de cs_jacques13
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 8 janv. 2007 à 11:18
0
Utile
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
Commenter la réponse de Renfield
Julien237 884 Messages postés vendredi 3 novembre 2000Date d'inscription 3 mars 2009 Dernière intervention - 8 janv. 2007 à 14:49
0
Utile
^^ 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.
Commenter la réponse de Julien237

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.