Problème detection couleur

cs_Billou Messages postés 34 Date d'inscription samedi 9 février 2002 Statut Membre Dernière intervention 27 août 2007 - 11 janv. 2007 à 23:34
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 - 12 janv. 2007 à 18:28
Bonjour,

Je veux faire un petit algorithme me permettant de déplacer le curseur de la souris sur un pixel ayant une certaine couleur. Voila mon algo :

procedure TForm1.Button1Click(Sender: TObject);
  var i, j,z : Integer;
  canvasB : TCanvas;

begin
  canvasB = TCanvas.create;
  For i := 1 To 1920 Do
    For j := 1 to 1200 Do
      Begin
        z := CanvasB.Pixels[i,j];
        If z <> 1 Then
          Continue
        else
          SetCursorPos(i,j);
      End;

canvasB.free
End;

Cela commence sérieusement a m'irriter car ca ne marche pas. Une erreur survient lors de l'exécution : "le canevas ne permet pas de dessiner".

Je ne comprend pas pourquoi cette erreur. Si je j'affiche z : aucun problème.

merci pour votre aide

BillouBillou

4 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
12 janv. 2007 à 17:24
Salut,


Tu as pas vraiment besoin de travailler sur un TCanvas je pense.


Pour placer la souris sur le pixel, il faut que tu commence par avoir une image affichée.


Ensuite, tu travails sur la TBitmap du composant contenant celle-ci. Y
a une routine très sympa qui pemet de récupérer les couleurs par lignes
de pixel, dont j'ai plus le nom.


Les coordonnées que tu en déduiras seront différentes de celle de
l'écran que tu utiliseras avec SetCursorPos. Donc tu devras trouver un
moyen de faire le calcul.


C'est certainement possible au moins via l'API Win32 GetClientRect
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
12 janv. 2007 à 17:29
Milles excuses, ClientToScreen est certainement plus approriée.
0
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
12 janv. 2007 à 18:17
Salut Billou,

l'erreur "le canevas ne permet pas de dessiner" vient de ne pas avoir attribué de handle au Canvas.

var
   handle: HWND;

CanvasB:= TCanvas.Create;
CanvasB.Handle:= GetDeviceContext(Handle);

@ rt 15 : pour récupérer les pixels par ligne, c'est la propriété ScanLine de TBitmap.  

A +
Thierry
0
ThWilliam Messages postés 418 Date d'inscription mardi 3 janvier 2006 Statut Membre Dernière intervention 26 novembre 2013 4
12 janv. 2007 à 18:28
correction : préférable de ne pas appeler la variable 'handle' dans une procedure de TForm (handle est une propriété de TWinControl dont dérive TForm).
Donc
var
   CanvHandle: HWND;
...
CanvasB.Handle:= GetDeviceContext(CanvHandle);
0
Rejoignez-nous