PowerII
Messages postés40Date d'inscriptionlundi 2 septembre 2002StatutMembreDernière intervention12 juillet 2009
-
5 sept. 2002 à 20:01
cs_EDDYMAUE
Messages postés1Date d'inscriptionsamedi 19 juillet 2003StatutMembreDernière intervention30 novembre 2004
-
30 nov. 2004 à 17:37
slt,
j'ai deja posé une kestion pour savoir komment recupéré la valeur d'un TColor en RGB et DelphiProg m'a dit ke devait le faire avec un ColorToRgb :) je veux bien mais le probleme c que kand il nous renvoi le rgb il ne le separe pas... comment savoir keski est le R, le G et B ?
je ne peu donc pas récupéré la couleur exacte.
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 5 sept. 2002 à 21:14
Soit les déclarations :
var
RGBColor : longint;
R, G, B : integer; //Red, green, blue
begin
RGBColor := ColorToRgb(Color);
//Pour dissocier les couleurs
R := GetRValue(RGBColor);
G := GetGValue(RGBColor);
B := GetBValue(RGBColor);
//pour recomposer une couleur :
Color := RGB(R, G, B);
Sinon, tu peux m'envoyer un message directement ;) .
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 5 sept. 2002 à 22:18
Ces fonctions ne sont pas documentées par BORLAND.
Comme je l'ai dit, la doc est le fichier d'aide sur les API WIN 32 de Microsoft.
Alors, si on ne connait pas, c'est très difficile de trouver. [;-)].
Salut à tous !
Ca se voit que vous revenez de vacances, vous êtes pleins de couleurs ;-))
cs_EDDYMAUE
Messages postés1Date d'inscriptionsamedi 19 juillet 2003StatutMembreDernière intervention30 novembre 2004 30 nov. 2004 à 17:37
Salut je ne suis pas programmeur Delphi mais je programme en Visual Foxpro V8.0.. Vc++(Pas souvent) et Assemebleur(Plus du tout)
Je peux donc malgré tout t'aider. À toi d'adapter en Delphi
Rgb à Couleur
R = rouge
G = Vert
B = Bleu
Comment se combine c'est trois valeurs.
Il faut se tourner vers l'hexadecimal pour comprendre.
0x veut dire hexadécimal et en VB je crois qu'il mettent & devant le chiffre ex h3C qui veut dire 60 en décimal
Color = 0xB + 0xG + 0xR
Exemple pour un RGB(10,30,60)
En décimal vs Hexa
R = 10 -- > 0A
G = 30 -- > 1E
B = 60 -- > 3C
Pour obtenir la couleur il faut faire une rotation, c'est dire RightShift ou LeftShift et faire la somme des trois valeur
R = 00000A
G = LeftShift(1E,8) 001E00
B = LeftShift(3C,16) 3C0000
On fait la somme = notre couleur
Je vais sur la calulette de windows
et je convertit en décimal
-- > 3939850
Je vais sur Vfp et je un RGB(10,30,60)
RGB(10,30,60) --> 3939850
Donc ça marche
Pour faire un ColorToRGB()
il faut juste faire l'inverse mais il faut aussi appliquer un masque
Avec fox et Vb on emploie BitAnd()
Pour extraire R de 3939850 ou de 3C1E0A
il faut isoler 0A ce qui veut dire éliminer 3C1E
En logique 0 and 0 = 0
0 and 1 = 0
1 and 0 = 0
1 and 1 = 1
si tu comprends pas remplace le par multiplier (seulement en binaire)
Donc appliquons notre masque
3C1E0A and 0000FF
Si on se place dans le contexte Binaire
3 C 1 E 0 A
0011 1100 0001 1110 0000 1010
And 0 0 0 0 F F
0000 0000 0000 0000 1111 1111
------------------------------------------------
0000 0000 0000 0000 0000 1010
0 0 0 0 0 A
Résutat du premier masque en respectant le fait que seulement et uniquement 1 and 1 fait 1
Donc obtient 00000A et comme en décimal les 0 en à gauche du chiffre n'ont aucunes valeus. Donc 0A --> 10
Voilà pour R
Pour trouver G il suffit d'appliquer une rotation vers la droite ou de diviser par 255 et d'appliquer le masque
3 C 1 E 0 A
0011 1100 0001 1110 0000 1010
Rotation vers la droite de 8 bit
0 0 3 C 1 E
0000 0000 0011 1100 0001 1110
On aplique le masque
0 0 3 C 1 E
0000 0000 0011 1100 0001 1110
And 0 0 0 0 F F
0000 0000 0000 0000 1111 1111
------------------------------------------------
0000 0000 0000 0000 0001 1110
0 0 0 0 1 E
00001E -- > 1E et en décimal 30
Pour finire il reste B à extraire
En faisant une rotation vers la droite de 16 on va obtenir automatique B
0 0 0 0 3 C | 1 E 0 A
0000 0000 0000 0000 0011 1100 | 0001 1110 0000 1010
ce qui nous donne 00003C -- > 3C -- >B = 60
En gros une Rotation vers la gauche de 8 bits c'est comme multiplier par 255. Une rotation vers la gauche de 16 bits c'est comme multiplier par (255*255)
Une rotation vers la droite de 8 bits c'est comme diviser par 255 et une rotation vers la droite de 16 bits c'est comme diviser par (255*255)
Un masque c'est de conserver seulement les bits qui nous intéresses
Pourquoi faire une rotation au lieu d'une multiplication/division
En assembleur une rotation vers la gauche déplace les bits vers la gauche
Dans un accumulateur d'un processeur 8 bits
on a pour la valeur 4
00000010 et que si je fais une rotation vers la gauche de 4 bits
<----
00100000 ce qui fait 0x20 en hexa et 32 en décimal
Si on fait une rotation vers la droite de 2 bit on fait inverse
00100000
-->
00001000 se qui fait 0x8 en hexa et 8 en decimal
Pourquoi favoriser une rotation par rapport à une multiplication/division
Question de vitesse. C'est 1000 fois plus rappide après compilation. Même optimiser ton compilateur va générer une vingtaines d'instruction de plus versus une pour la rotation.
Ceci dit trouve en Delphi tes instructions de rotation de et de masque.