ColorToRgb - probleme

PowerII Messages postés 40 Date d'inscription lundi 2 septembre 2002 Statut Membre Dernière intervention 12 juillet 2009 - 5 sept. 2002 à 20:01
cs_EDDYMAUE Messages postés 1 Date d'inscription samedi 19 juillet 2003 Statut Membre Dernière intervention 30 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.

Merci d'avance

6 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
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 ;) .

May Delphi be with you.
Delphi advanced
0
fabiin Messages postés 329 Date d'inscription mercredi 4 avril 2001 Statut Membre Dernière intervention 8 décembre 2009 6
5 sept. 2002 à 21:34
heu
je connais pas ces fonctions
mais en faisant
GetRValue(Macouleur);
par exemple
ben ca marche, et sans passer par ColorToRgb,...

@+
Fabs 8-)
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
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 ;-))

May Delphi be with you.
Delphi advanced
0
fabiin Messages postés 329 Date d'inscription mercredi 4 avril 2001 Statut Membre Dernière intervention 8 décembre 2009 6
6 sept. 2002 à 18:14
ok, cela dit,
je parlais du faite , ke d'apres mes essais ColorToRGB est inutil :)
@+
Fabs 8-)
0

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

Posez votre question
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
6 sept. 2002 à 19:15
C'était juste pour info !

May Delphi be with you.
Delphi advanced
0
cs_EDDYMAUE Messages postés 1 Date d'inscription samedi 19 juillet 2003 Statut Membre Dernière intervention 30 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.

Bonne chance

Eddy Maue a+
0
Rejoignez-nous