Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Pixelparty - oder das irre Projekt *seufz* (https://www.delphipraxis.net/58480-pixelparty-oder-das-irre-projekt-%2Aseufz%2A.html)

tretmine.net 7. Dez 2005 16:38


Pixelparty - oder das irre Projekt *seufz*
 
Hallo!

Ich habe relativ wenig Erfahrung mit Delphi. Bisher habe ich jedoch eigentlich alles mit meinen begrenztem Wissen irgendwie lösen können.
Nun stehe ich jedoch vor einem großen Problem:

Ich will ein Programm schreiben, welches einen Ausschnitt von meinem Bildschirm ständig im Auge behält. Ändern sich xyz-Pixel in der Zeitspanne abc, dann soll das Programm einem anderen Programm eine Anweisung geben.

Nun ist die Frage: Wie lese ich ein Pixel vom Bildschirm aus? Also den Farbwert.
Ich habe zwar in der Codebase etwas gefunden, aber das bezieht sich nur auf Images, oder?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  dc: hDc;
begin
  dc := GetDC(0);
  Color := GetPixel(dc, x, y); //statt x und y, bitte Integer eingeben
  ReleaseDC(0, dc);
end;
Weiter wollte ich fragen: Ist das überhaupt realistisch? Also könnte es mit genug Engagement etwas werden, oder ist ein Ausschnitt, welcher ca. 5x5 cm groß ist, garnicht pixelweise zu betrachten?
Wie würdet ihr daran gehen?
Ich sitze gerade vor meinem Dephi und weiß eigentlich garnicht, wo ich anfangen soll. Plz helft mir.

Eine wirkliche "Bildanalyse, wie hier beschrieben: http://www.delphipraxis.net/internal...xel+bildschirm brauche ich nicht. Die Änderungsrate muss bei mir nur einen gewissen Schwellenwert (durch Probieren später herauszufinden) übersteigen.

Thx schon mal.

MfG Phil

P.S.: Ach ja, ich habe das ins Multimedia geschrieben, da ich eine "Spielzeug-"Kamera auslesen will, und etwas danach steuern will... Ich hoffe es ist richtig plaziert...

tretmine.net 7. Dez 2005 17:04

Re: Pixelparty - oder das irre Projekt *seufz*
 
Ok... Ich glaub ich habe es soweit zumindest mal einen pixel auszulesen... nun aber die Frage: wie mache ich ein TColor zu einem String o.ä.
Hört sich jetzt zwar sehr doof an, aber ich kann mir unter "TColor" nix vorstellen. Wie kann ich mir die Farbwerte anzeigen lassen?

MfG Phil

sh17 7. Dez 2005 17:09

Re: Pixelparty - oder das irre Projekt *seufz*
 
Ein TColor ist einfach nur ein Integer

Hast Du zwei Colorwerte eines Pixels des Bildschirms, dann vergleich sie einfach

tretmine.net 7. Dez 2005 17:12

Re: Pixelparty - oder das irre Projekt *seufz*
 
Ah... IntToStr... Du glaubst nicht, was ich alles probiert habe *lach*. Aber darauf bin ich nicht gekommen. Thx.

Ging schneller, als ich dachte. Zuerst bin ich 2 Stunden vor dem PC gesessen und hab nicht gewusst wo ich anfangen soll. Kaum klappt es mit diesem "GetPixel" und schon läuft es wie am Schnürchen... Thx

MfG Phl

ichbins 7. Dez 2005 17:32

Re: Pixelparty - oder das irre Projekt *seufz*
 
Hier eine Screenshot-Funktion:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  i,i2:integer;
  b2:tbitmap;
  r:trect;
begin
  if not savedialog1.Execute then
    application.Terminate;
  b:=tbitmap.Create;
  b.Width:=screen.Width;
  b.Height:=screen.height;
  b.Canvas.handle:=GetWindowDC(GetDesktopWindow);
  b2:=tbitmap.Create;
  b2.Width:=screen.Width-1;      
  b2.Height:=screen.Height-1;
  sleep(100);
  b2.Canvas.CopyRect(screen.desktoprect,b.Canvas,screen.desktoprect);
  if savedialog1.filterindex=1 then
    b2.SaveToFile(savedialog1.filename) else
  begin
    j:=tjpegimage.create;
    form2:=tform2.Create(application);
    form2.showmodal;
    j.assign(b2);
    j.savetofile(savedialog1.FileName);
    j.free;
  end;
  application.terminate;
  b.free;
  b2.free;
end;
Hab ich mal geschrieben.

Kannst du ja einfach abwandeln. Statt screen.desktoprect nimmst du den zu beobachtenden Bildschirmbereich und statt der Speicherungsprozedur schreibst du eine Vergleichsprozedur.
Delphi-Quellcode:
var
  i,i2:integer;
  b,b2:tbitmap;
  r,zubeobachtenderbereich:trect;
begin
  zubeobachtenderbereich.left:=...;

  b:=tbitmap.Create;
  b.Width:=screen.Width;
  b.Height:=screen.height;
  b.Canvas.handle:=GetWindowDC(GetDesktopWindow);
  b2:=tbitmap.Create;
  b2.Width:=screen.Width-1;      
  b2.Height:=screen.Height-1;
  sleep(100);
  b2.Canvas.CopyRect(screen.desktoprect,b.Canvas,zubeobachtenderbereich);
  //Hier BMPs vergleichen
  b.free;
  b2.free;
end;

Nicolai1234 7. Dez 2005 17:42

Re: Pixelparty - oder das irre Projekt *seufz*
 
Darf man fragen, wofür das eigentlich genau benötigt wird? Eventuell ist eine soclhe Lösung gar nicht sinnvoll und etwas ressourcenschonenderes besser...

tretmine.net 7. Dez 2005 18:02

Re: Pixelparty - oder das irre Projekt *seufz*
 
Also...
Es gibt 2 Anwendungsbereiche.

1.
Mein Onkel, welcher sich leider eine Kamera ohne genau diese Funktion (die gibts manchmal schon integriert) gekauft hat, will seine Kasse und Lager damit überwachen. Dort sind leider größere Gottes Fehlbestände zu verzeichnen.
Diese werden mittels einer TV-Karte auf einem PC gespeichert. Nur ist eben das doofe: Es wird viel zu viel gespeichert *gg*.
Hier könnte man aber noch sagen: Pech, dann muss er sich eben ein anderes System kaufen, wobei es sehr schwierig ist eine Kamera mit Funkübertragung UND die oben erwähnte Funktion zu finden. Wobei ich immer noch der Meinung bin, dass eine zufällige Überprüfung und bei der Kasse ein konsequenteres Herausgeben des Schlüssels mehr Erfolg bringen würde.

2.
Ich will mir evtl. irgendwann solch eine Spielzeug-Kamera kaufen (wenn ich mal Geld habe ^^) und darüber etwas automatisch steuern. Sprich das Bild in verschiedene Felder aufteilen und nun etwas darüber automatisieren. Bei Fischertechnik gibts afaik so etwas auch.
Spielerei, aber der Mensch lebt nicht nur von bierernstem Schaffen.
Das ist eigentlich mein Hauptantrieb.

3.
Ich wollte eigentlich immer schon einmal wissen, wie man so etwas macht. Also rein interessenhalber mal nicht "nur" kleine Programme schreiben, die nur etwas hin- und herschreiben, sondern auch mal etwas diffuses und schwer fassbares (wann ändert sich ein Bild?!?) schreiben.

MfG Phil

ichbins 7. Dez 2005 18:06

Re: Pixelparty - oder das irre Projekt *seufz*
 
Dann wird der Vergleich schwieriger. Denn die Pixel ändern sich dauernd (Helligkeitsschwankungen etc...)

Oxmyx 7. Dez 2005 18:12

Re: Pixelparty - oder das irre Projekt *seufz*
 
Du hast jetzt aber nicht wirklich die TColor-Werte in Strings umgewandelt, um sie zu vergleichen?

ichbins 7. Dez 2005 18:19

Re: Pixelparty - oder das irre Projekt *seufz*
 
Du müsstest die RGB-Werte extrahieren und dann vergleichen ob der Unterschied zum vorherigen Wert höher als beispielsweise 64 ist. Wenn ja, inkrementierst du einen Zähler.

Wenn sich der Farbton dann bei mehr als beispielsweise 1024 Pixeln gleichzeitig verändert hat, schlägst du Alarm. Diese Berechnungsmethode benötigt allerdings seeeeeeeeeeeeeeehr viel Zeit.

Deshalb habe ich hier eine Funktion geschrieben (ursprünglich sollte sie entscheiden ob ein Bitmap nun schwarzweiss ist), die nur ein Gitter von 100 Probepixeln vergleicht:

Delphi-Quellcode:
function pos(i:integer):integer;
begin
  if i<0 then result:=-i else result:=i;
end;

function changed(old,new:tbitmap):boolean;
var
  i,j,counter,rold,gold,bold,rnew,gnew,bnew:integer;
  pixold,pixnew:tcolor;
begin
  counter:=0;
  for i:=1 to 10 do
    for j:=1 to 10 do
    begin
      pixold:=old.Canvas.Pixels[((old.Width*i) div 10)-(old.Width div 20),((old.Height*j) div 10)-(old.Height div 20)];
      pixnew:=new.Canvas.Pixels[((new.Width*i) div 10)-(new.Width div 20),((new.Height*j) div 10)-(new.Height div 20)];
      bold:=(pixold shr 16) and $FF;
      gold:=(pixold shr 8) and $FF;
      rold:=(pixold and $FF);
      bnew:=(pixnew shr 16) and $FF;
      gnew:=(pixnew shr 8) and $FF;
      rnew:=(pixnew and $FF);
      if pos(bold-bnew)+pos(gold-gnew)+pos(rold-rnew)>=64*3 then
        inc(counter);
    end;
  if counter>10 then
    ALARMSCHLAGEN, da sich die Farbe von 10% der Pixel des Bildes um mehr als 1/4 geändert hat.
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:32 Uhr.
Seite 1 von 3  1 23      

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