cs_jacques13
Messages postés252Date d'inscriptionmardi 3 juin 2003StatutMembreDernière intervention29 juin 2013
-
6 janv. 2007 à 21:02
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDerniè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
cs_jacques13
Messages postés252Date d'inscriptionmardi 3 juin 2003StatutMembreDernière intervention29 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.
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 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)
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 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...
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 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
cs_jacques13
Messages postés252Date d'inscriptionmardi 3 juin 2003StatutMembreDernière intervention29 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
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 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 :
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...
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 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à ^^
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 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...