Connaitre la couleur d un pixel sous windows

Signaler
Messages postés
124
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
11 mai 2009
-
Messages postés
13
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
21 septembre 2006
-
Bonjour a tous!
Mon probleme:
j ai besoin de connaitre la couleur d un pixel particulier(par exemple celui pointé par la souris ou bien un pixel dont on a definit les coordonnees)et ..... je ne sais pas comment faire :D
en delphi j ais trouvé ce squelette de prog sur le net:
"var
Pos: TPoint;
Couleur:TColor;
begin
GetCursorPos(Pos);
Couleur := DesktopColor(Pos.X, Pos.Y);"[i/]

mais je comprends moyennement le delphi.

pourtant la fonction [i]DesktopColor(...,..) me conviendrait parfaitement..
existe il une telle fonction dans windows.h ?

comment recuperer une couleur exactement?(une classe couleur?3valeurs renvoyées suivant les teintes?)

un badeau se sent il l ame de me répondre?
merci d avance ! ;)

14 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
GetPixel
BruNews, ciao...
Messages postés
124
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
11 mai 2009
13
j ai essayé la fonction GetPixel de cette maniere:

#include "windows.h"
#include <conio.h>

int main()
{ int R,G,B;
HDC ScreenSrc;
ScreenSrc = GetWindowDC(0);
pix = GetPixel(ScreenSrc, 512 , 384 );
R = GetRValue(pix);//->valeur du rouge (0-255)
G = GetGValue(pix);//->valeur du vert (0-255)
B = GetBValue(pix);//->valeur du bleu (0-255)
}

Réponse du compilateur(ou plus exactement de l editeur de lien) :
[linker error]undefined reference to 'GetPixel@12'

j utilise dev-cpp comme environnement de travail..
es ce que j ai oublié quelque chose? dans les options du lieur?
Dans les inclusions?
Merci quand meme :)
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
sur VC++ <windows.h> suffit.
autrement voir MSDN.
BruNews, ciao...
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
A priori BruNews ce n'est un problème d'en-tête mais pultot de lib
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Au fait on n'écrit pas #include "windows.h" mais #include<windows.h>
Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007
1
les deux peuvent s'ecrire vecchio, avec les guillemets il va chercher le header a un chemin donner, a partir du dossier de travail en cours, mais cela n'empeche pas le preprocesseur d'aller chercher le fichier dans ses dossiers systemes s'il ne l'as pas trouver

"j utilise dev-cpp comme environnement de travail..
es ce que j ai oublié quelque chose?"

oui, tu as oublier d'utiliser Visual Studio :D
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Encore une perle, c'est la soiree. Je vais finir par en faire un bouquin.
BruNews, ciao...
Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007
1
lol, j'avoue qu'elle etais facile :)
Nix, met moi -2 stp, je suis sport :P
Messages postés
124
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
11 mai 2009
13
Pour ce qui est de VC++,j ai eu des echos comme quoi ca n était pas tres performant, trop formaté.
Il faudrait que j essaie pour me faire une opinion.

Bon pour mon probleme, je me suis débrouillé en trouvant la dll qui manquait (gdi32) et en bidouillant un peu je l ai mise dans les options de liage donc ... tout marche maintenant...
je suis confronté à un probleme bien plus embetant:

la lenteur de la fonction GetPixel(...) !!!
(déja sujet d un message qui n avait pas eu de succes)

une boucle de quelques lignes (une dizaine),utilisant la fonction GetPixel pour verifier le pixel central de l ecran aura une vitesse de parcour de 0.5 ms sur mon 1.50Ghz(ca me parait dingue en fait),c est pas possible que ce soit si lent..),et entraine par ailleurs une forte utilisation de l uc si je n inclut pas de Sleep(1) dans chaque boucle...

Personne ne connait d alternative a cette *$"#* de fonction? :big)
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
La lenteur de GePixel() est 'normale' si on considere ce qu'elle implique comme acces memoire.
Si tu as beaucoup de lignes a balayer, remplace en faisant une 'photo' bimap en 1 passe et tu pourras te servir de GetDIBits bien + rapide. Tu vois MSDN pour details.
BruNews, ciao...
Messages postés
124
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
11 mai 2009
13
"oups" je n'ai pas précisé : je n'ai qu'un pixel à vérifier dans ma boucle :big)

Voici la boucle incriminée:
while (*pasEncoreTrouvéDeConditionDeSortie :big) *)
{
pix = GetPixel(ScreenSrc, 512 , 384 );
R = GetRValue(pix);//->valeur du rouge (0-255)
V = GetGValue(pix);//->valeur du vert (0-255)
B = GetBValue(pix);//->valeur du bleu (0-255)

SetPixel(ScreenSrc, 512 , 384 , pix2);
if ( (R<=RMAX&&R>=RMIN) && (V<=VMAX&&V>=VMIN) && (B<=BMAX&&B>=BMIN) )
{
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
Sleep(15);//temps pendant lequel la souris reste "appuyée"
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
}
Sleep(3);//interval entre deux checks
cpt++;
}

Je voudrais comme condition de sortie la pression d'une touche particulière mais je voit mal comment faire....(un getch peut être? mais placé a quel endroit ?

Si quelqun trouve des alternatives interessantes à une partie de cette boucle,je suis preneur, n'hésitez pas a critiquer tout ce qui pourra ameliorer sa vitesse d'éxecution sera le bienvenue :)
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
getch ? mais c'est pour les CONSOLEries.
WM_KEYDOWN pour la pression d'une touche clavier.
Et abandonne la console a moins que tu ne developpes un compilo.
BruNews, ciao...
Messages postés
124
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
11 mai 2009
13
Non non, ce programme utilise les api windows... il est pas sur console...mais de toute facon il ne se manifeste pas, c'est juste une tache de fond(notez quand meme qu'à 90%de l'uc utilisée sans Sleep ca fait une sacrée tache de fond :approve) )...
Alors aucune idee d'amélioration ?
On pourrait pas utiliser une interruption périphérique pour connaitre la couleur du pixel central? :/
parce qu'une des contraintes c'est que le programme n analyse pas une image fixe mais une image rafraichie 60 fois par seconde ...
Messages postés
13
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
21 septembre 2006

LOL !

Toi tu serais pas entrain de faire un auto fire ?

:big)