Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Bestimmte Farbe auf dem Desktop suchen (https://www.delphipraxis.net/160569-bestimmte-farbe-auf-dem-desktop-suchen.html)

speedy 20. Mai 2011 00:23

Delphi-Version: 2009

Bestimmte Farbe auf dem Desktop suchen
 
Hi,

versuche mich gerade daran einen Punkt mit einer bestimmten Farbe irgendwo auf dem Desktop zu finden.

Hab das mal mit zwei Schleifen und der GetPixel Funktion versucht, die den Monitor zeilenweise "scannen", bis der Integer-Wert von GetPixel mit dem gesuchten Wert übereinstimmt.
Das Ganze funktioniert prinzipiell auch, nur ist das so brutal langsam, dass der schon ne halbe Minute für eine einzelne Zeile braucht. Selbst wenn ich den zu untersuchenden Bereich auf etwa 50x50 Pixel verkleinere dauert das noch ein paar Sekunden...

Weiß da jemand da eine schnellere Methode?

Hab irgendwann mal vor ein Live-Video von einer Webcam auf einen bestimmten Farbbereich zu scannen. So soll z.B. eine farbige Kugel auf einem weißen Tisch verfolgt werden. Nur macht das natürlich bei der Geschwindigkeit nicht wirklich Sinn.


Danke und schöne Grüße
speedy

s.h.a.r.k 20. Mai 2011 00:46

AW: Bestimmte Farbe auf dem Desktop suchen
 
Hm, ich glaube, du machst da irgendwas übelst falsch, denn sonst wäre das nicht so lahm :gruebel: Zeig mal deinen Code her.

Bora4d 20. Mai 2011 01:55

AW: Bestimmte Farbe auf dem Desktop suchen
 
Mach mit Desktop-Canvas Bildschirmkopie in ein TBitmap und verwenden Scanline-Eigenschaft von TBitmap.
Das ist der übliche Weg und auch schnelste. Verglichen mit GetPixel ist es wie ein Umstieg von Trabi auf Ferrari :-D

speedy 20. Mai 2011 11:52

AW: Bestimmte Farbe auf dem Desktop suchen
 
Das ist der verwendete Code:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var cx1, cy1, cx2, cy2, buffer : integer;
    dc : hdc;
begin
  dc := createdc('DISPLAY',nil,nil,nil);
  cy1 := strtoint(edit2.Text);          //start y
  cx2 := strtoint(edit3.Text);          //ende x
  cy2 := strtoint(edit4.Text);          //ende y
  while cy1 < cy2 do
    begin
      cx1 := strtoint(edit1.Text);       //start x
      while cx1 < cx2 do
        begin
          buffer := getpixel(dc,cx1,cy1);
          cx1 := cx1 + 1;
          if (buffer > 2300000) and (buffer < 2400000) then memo1.Lines.Add(inttostr(cx1)+' '+inttostr(cy1)); //genauer wert: 2302444
        end;
      memo1.Lines.Add('zeile '+inttostr(cy1));   //nur zum testen
      cy1 := cy1 + 3;                    //3 zeilen weiter springen
    end;
end;


Das seltsame ist auch, dass die CPU Auslastung gerade mal um 5 - 8 % ansteigt während er arbeitet.

Werde dann mal die Methode mit Scanline testen...

Gruß
speedy

rollstuhlfahrer 20. Mai 2011 12:21

AW: Bestimmte Farbe auf dem Desktop suchen
 
Dein Buffer ist ein Farbwert vom Typ TColor. Da liegen die Farben im Hex-Format ala $00RRGGBB (RR = Rot, GG = Grün, BB = Blau) drin. Deine Bereichsprüfung findet jetzt nicht nur Stellen, wo deine gewünschte Farbe drin ist, sondern auch noch alle stellen, die etwas mehr oder weniger Blau haben und weil dein Bereich so groß ist, darf sich der Wert von Grün auch noch dramatisch ändern und es fällt durch.

Bernhard

DeddyH 20. Mai 2011 12:30

AW: Bestimmte Farbe auf dem Desktop suchen
 
War das nicht anders herum (BGR)?

stahli 20. Mai 2011 12:31

AW: Bestimmte Farbe auf dem Desktop suchen
 
RGB stimmt.

DeddyH 20. Mai 2011 12:33

AW: Bestimmte Farbe auf dem Desktop suchen
 
Dann bin ich farbenblind.
Delphi-Quellcode:
procedure TForm5.FormCreate(Sender: TObject);
begin
  Color := $00FF0000; //wäre demnach reines Rot
end;
Mein Formular wird aber blau.

Wolfgang Mix 20. Mai 2011 12:42

AW: Bestimmte Farbe auf dem Desktop suchen
 
@Detlef:
RGB war schon richtig. Du hast 2 Nullen zuviel!
So wird es richtig (grün)

Delphi-Quellcode:
Color := $00FF00;

DeddyH 20. Mai 2011 12:45

AW: Bestimmte Farbe auf dem Desktop suchen
 
Natürlich wird das grün, wenn ich bei 3 Teilen die beiden äußeren tausche und danach auf den mittleren zugreife :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:10 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz