Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi GetPixel() funktioniert irgendwie nicht :( (https://www.delphipraxis.net/38756-getpixel-funktioniert-irgendwie-nicht.html)

Wusel 23. Jan 2005 19:45


GetPixel() funktioniert irgendwie nicht :(
 
Guten Abend an alle

Also irgendwie funktioniert GetPixel nur so halb, aber ich denke eher, dass ich einen Fehler gemacht habe :roll:
Ich will einfach während ich spiele, ein Screenshot machen und aus dem Screenshot dann bestimmte Informationen holen (Zahlen). Das hab ich so gelöst, dass ich mir bestimmte Pixel anschaue, sie mit vorgegebenen Mustern von Zahlen vergleiche und dadurch die Zahl bekomme. Das geht in meinem Fall, da die Zahlen alle gleich breit sind und immer an der selben Stelle stehen. Es verändert sich halt nur der Betrag der Zahl. Das funktioniert auch so weit. Jedoch nur, wenn ich z.B. ein Screenshot als Hintergrundbild nehme. Wenn ich im Spiel selbst die Funktion mit GetPixel durchlaufen lasse, gibt GetPixel an jeder Stelle nur den Wert 0 zurück :(
Hier der Code den ich verwende:

Delphi-Quellcode:
var
  imgDC : Cardinal;
begin
  imgDC := 0;

  try
    imgDC := GetDC(0);

    for i := 0 to 6 do //7 Pixel prüfen, um eine Zahl zu identifizieren
      begin
        [...]GetPixel(imgDC, WSDotCoords[i].X, WSDotCoords[i].Y); [...]
      end;
  finally
    if imgDC <> 0 then
      ReleaseDC(0, imgDC);
  end;
end;
Also wie gesagt, wenn ich das im Spiel mache, gibt GetPixel nur 0 zurück. Das Komische ist aber, wenn ich imgDC mit BitBlt() an ein Handle von einem TBitmap übergebe und das Bitmap dann speichere, ist der Screenshot ganz normal da und an den Stellen, die GetPixel() prüfen soll ist definitiv eine Farbe!
Was mach ich denn falsch? :(



Wusel

Elite 23. Jan 2005 20:14

Re: GetPixel() funktioniert irgendwie nicht :(
 
Zitat:

Zitat von Wusel
Das Komische ist aber, wenn ich imgDC mit BitBlt() an ein Handle von einem TBitmap übergebe und das Bitmap dann speichere, ist der Screenshot ganz normal da

Ohne jetzt näher auf das Problem einzugehen: Warum holst du dir dann nicht einfach die gesuchten Pixelfarben über dein erstelltes Bitmap?
Oder ist dir das zu langsam?

Wusel 23. Jan 2005 21:44

Re: GetPixel() funktioniert irgendwie nicht :(
 
Wenn ich das TBitmap benutze, muss ich die Graphics Unit einbinden und dadurch wird mein Programm extrem groß. Habs nich um sonst hier in die Win-API Sparte geschrieben. Will hauptsächlig nur mit den HDCs arbeiten, aber das klappt ja nicht :(

Wusel 24. Jan 2005 17:48

Re: GetPixel() funktioniert irgendwie nicht :(
 
Hat keiner 'ne Idee, warum GetPixel da nicht richtig mitmachen will? :|

TStringlist 24. Jan 2005 18:05

Re: GetPixel() funktioniert irgendwie nicht :(
 
event. ist der von dir mittels 'GetDC' organisierte 'device context' in dem Falle nicht mehr gültig? Versuche es doch auch mal mit 'CreateDC', z.B. so wie in der folgenden kurz-Proc:


Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var DC : HDC;
    AColor : array[1..4] of byte;
begin
  DC:=CreateDC('DISPLAY',NIL,NIL,NIL);
  DWord(AColor) := GetPixel(DC,Mouse.CursorPos.X,Mouse.CursorPos.Y);
  DeleteDC(DC);
  Label1.Caption := 'R: ' + IntToStr(AColor[1]) + ';  ' +
                    'G: ' + IntToStr(AColor[2]) + ';  ' +
                    'B: ' + IntToStr(AColor[3]);
end;

Wusel 24. Jan 2005 18:42

Re: GetPixel() funktioniert irgendwie nicht :(
 
Nein, spielt keine Rolle. Habs versucht mit dem CreateDC, kommt aber auch überall 0 raus, wenn ich es im Spiel mache.
Habs so probiert, dass es die Werte erst speichert und dann, wenn ich aus dem Spiel raus bin, durch nen Tastendruck die Werte ausgibt --> 0
Wenn ich die Werte an ein Label o.ä. übergebe, während ich noch im Spiel bin (also wenn das DC auf jeden Fall noch gültig ist) --> 0
Jedoch kann es in beiden Fällen aus dem DC mittels BitBlt ein TBitmap erstellen :?:

Wenn ich nur auf dem Desktop bin, funktioniert alles, wie es soll ... was ist so unterschiedlich an den DCs während des Spiels und 'normal' im Windows??

DerDan 24. Jan 2005 19:05

Re: GetPixel() funktioniert irgendwie nicht :(
 
Hi,

wenn dein Spiel via DirectX auf den Bildschirm pinselt, dann geht das vielleicht generell nicht, das Pixel über den ganzen Devive Context wieder auszulesen...

ich würd also erstma mit einem zweite Delphi Exe experimentieren, die grob das gleiche macht wie dein Spiel (Zahlen mahlen)

DerDan

Wusel 24. Jan 2005 19:08

Re: GetPixel() funktioniert irgendwie nicht :(
 
Ja, das Spiel läuft über DirectX, aber warum kann ich dann mit dem DC, mit welchem GetPixel nur 0 zurückgibt, mittels BitBlt ein TBitmap erzeugen, welches dann das richtige Bild enthält?

DerDan 24. Jan 2005 19:11

Re: GetPixel() funktioniert irgendwie nicht :(
 
Könnt ja ne inkosistenz in der WinApi sein,

hast ma mit aus einem anderen Prog versucht die Pixels zu bekommen?

DerDan

Wusel 24. Jan 2005 19:14

Re: GetPixel() funktioniert irgendwie nicht :(
 
Wie bereits geschrieben, funktioniert es 'normal' unter Windows mit jedem anderen Fenster/Programm. Sollte halt auch nicht so viel umgerechnet und so werden, da es sonst einen kleinen (oder größeren) Ruckler im Spiel gibt und das wollt ich weitestgehend vermeiden.

QuickAndDirty 25. Jan 2005 16:09

Re: GetPixel() funktioniert irgendwie nicht :(
 
DirectX erzeugt die Grafiken diereckt im Grafikspeicher.
getpixel holt sie sich aber aus dem im Arbeitspeicher liegenden
Puffer von Windows denke ich mal.
BitBlitting baut nicht auf getpixel auf, es wird von vielen
Grafikkarten hardware mässig unterstützt so das windows evtl.
nicht viel mehr tut als auf den entsprechenden interrupt vector
der Grafikkarte zu verzweigen.

kann aber auch sein das das alles bullshitt ist.

Luckie 25. Jan 2005 16:13

Re: GetPixel() funktioniert irgendwie nicht :(
 
Nein das dürfte so hinhauen.

Wusel 25. Jan 2005 18:45

Re: GetPixel() funktioniert irgendwie nicht :(
 
Ah ok :thumb: jetzt weiß ich schonmal, warum es nicht funktioniert.
Aber wie müsste ich es dann 'umbiegen', dass es so funktioniert wie ich will?
Wie bring ich das aus dem Speicher der Grafikkarte in den Arbeitsspeicher? Oder wie kann ich auf den Speicher der Grafikkarte zugreifen?

QuickAndDirty 26. Jan 2005 22:08

Re: GetPixel() funktioniert irgendwie nicht :(
 
DirectX

Vielleicht DirecktDraw.
mit sicherheit geht wenn du dierreckt über den Treiber
zugreifst. aber wer kann das schon?
und es brächte dir ja auch nur etwas für eine grafikkarte.

Wusel 27. Jan 2005 13:30

Re: GetPixel() funktioniert irgendwie nicht :(
 
Ich brauchs ja auch nur für mich allein. Das muss man doch irgendwie umwandeln können, BitBlt kann es doch auch :roll:

scp 27. Jan 2005 13:45

Re: GetPixel() funktioniert irgendwie nicht :(
 
Man kann per API auch eine BMP im Speicher erstellen, und diese mit BitBlt füllen. Dazu müsste auch im Forum was zu finden sein. Evtl. mal nach Hier im Forum suchenCreateBitmap oder so suchen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:15 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