AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Pixelparty - oder das irre Projekt *seufz*
Thema durchsuchen
Ansicht
Themen-Optionen

Pixelparty - oder das irre Projekt *seufz*

Ein Thema von tretmine.net · begonnen am 7. Dez 2005 · letzter Beitrag vom 16. Dez 2005
Antwort Antwort
Seite 1 von 3  1 23      
tretmine.net

Registriert seit: 9. Jan 2005
Ort: Bretzfeld
15 Beiträge
 
#1

Pixelparty - oder das irre Projekt *seufz*

  Alt 7. Dez 2005, 17:38
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...
  Mit Zitat antworten Zitat
tretmine.net

Registriert seit: 9. Jan 2005
Ort: Bretzfeld
15 Beiträge
 
#2

Re: Pixelparty - oder das irre Projekt *seufz*

  Alt 7. Dez 2005, 18:04
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
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.664 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Pixelparty - oder das irre Projekt *seufz*

  Alt 7. Dez 2005, 18:09
Ein TColor ist einfach nur ein Integer

Hast Du zwei Colorwerte eines Pixels des Bildschirms, dann vergleich sie einfach
Sven Harazim
--
  Mit Zitat antworten Zitat
tretmine.net

Registriert seit: 9. Jan 2005
Ort: Bretzfeld
15 Beiträge
 
#4

Re: Pixelparty - oder das irre Projekt *seufz*

  Alt 7. Dez 2005, 18:12
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
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#5

Re: Pixelparty - oder das irre Projekt *seufz*

  Alt 7. Dez 2005, 18:32
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;
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Nicolai1234

Registriert seit: 21. Feb 2004
1.008 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Pixelparty - oder das irre Projekt *seufz*

  Alt 7. Dez 2005, 18:42
Darf man fragen, wofür das eigentlich genau benötigt wird? Eventuell ist eine soclhe Lösung gar nicht sinnvoll und etwas ressourcenschonenderes besser...
  Mit Zitat antworten Zitat
tretmine.net

Registriert seit: 9. Jan 2005
Ort: Bretzfeld
15 Beiträge
 
#7

Re: Pixelparty - oder das irre Projekt *seufz*

  Alt 7. Dez 2005, 19:02
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
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#8

Re: Pixelparty - oder das irre Projekt *seufz*

  Alt 7. Dez 2005, 19:06
Dann wird der Vergleich schwieriger. Denn die Pixel ändern sich dauernd (Helligkeitsschwankungen etc...)
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Oxmyx

Registriert seit: 21. Sep 2004
499 Beiträge
 
#9

Re: Pixelparty - oder das irre Projekt *seufz*

  Alt 7. Dez 2005, 19:12
Du hast jetzt aber nicht wirklich die TColor-Werte in Strings umgewandelt, um sie zu vergleichen?
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#10

Re: Pixelparty - oder das irre Projekt *seufz*

  Alt 7. Dez 2005, 19:19
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;
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:48 Uhr.
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