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 ! ;)
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 :)
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?"
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)
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...
"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 :)
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...
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 ...