Autor |
Beitrag |
SAiBOT
      
Beiträge: 323
Erhaltene Danke: 6
XP SP2; 7
D7; D2009
|
Verfasst: Fr 24.07.09 16:03
Hallo,
ich habe es bisher immer so gemacht:
-ein TBitmap erstellt
-mit GetDC das hDC des Desktops geholt
-mit CopyRect die benötigten Desktop Pixel ins TBitmap kopiert
-per TBitmap.ScanLine die gewünschten Pixel ausgewertet
Das ist schonmal schneller als TCanvas.GetPixel nur leider ist mir das noch viel zu langsam.
Gibt es eine schnellere Methode?
Villeicht nur mit Hilfe der API?
_________________ Debuggers don't remove bugs, they only show them in slow-motion.
Zuletzt bearbeitet von SAiBOT am Sa 01.08.09 18:30, insgesamt 1-mal bearbeitet
|
|
platzwart
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: Fr 24.07.09 19:46
Versuch mal die TBitmap32 aus den Graphics32, die ist viiiiiiiiiiel schneller 
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 24.07.09 20:27
Und noch besser:
Nimm direkt GetPixel und wende das auf den DC an... 
|
|
SAiBOT 
      
Beiträge: 323
Erhaltene Danke: 6
XP SP2; 7
D7; D2009
|
Verfasst: Fr 24.07.09 20:53
_________________ Debuggers don't remove bugs, they only show them in slow-motion.
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Fr 24.07.09 21:33
Mittels ScanLine hast du ja schon dirket den zugriff auf die einzelen Pixel (über Pointer) da wirst du nicht viel machen können. Das langsame ist ja das BitBlt (CopyRect). Versuch es mal direkt mit der Api und setz vorher ganz wichtig das Pixelformat des Bitmaps auf die Desktop Farbtiefe (z.B. pf32Bit). Dann sollte das kopieren aus dem DC in den Buffer schnell sein. Dann ist halt die Frage wie dein Code zur Auswertung strukturiert ist. Ggf. Kannst du mit Assembler optimieren.
Andere Frage: Was hast du vor? (z.B. bei Spielen gehts eventl in Ogl über glReadPixels schneller etc.)
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 24.07.09 21:45
SAiBOT hat folgendes geschrieben : | mag für einzelne Pixel gut sein, aber will man mehrere Prüfungen machen taugt diese Funktion nicht viel! |
Das stimmt, ich hatte das jetzt so verstanden, dass vor allem immer wieder das Bild geholt wird. Wenn es um viele Pixel jeweils geht, dann ist das mit einzelnen Pixeln so natürlich nicht so sinnvoll, das stimmt.
|
|
SAiBOT 
      
Beiträge: 323
Erhaltene Danke: 6
XP SP2; 7
D7; D2009
|
Verfasst: Sa 25.07.09 17:12
uall@ogc hat folgendes geschrieben : | Mittels ScanLine hast du ja schon dirket den zugriff auf die einzelen Pixel (über Pointer) da wirst du nicht viel machen können. Das langsame ist ja das BitBlt (CopyRect). Versuch es mal direkt mit der Api und setz vorher ganz wichtig das Pixelformat des Bitmaps auf die Desktop Farbtiefe (z.B. pf32Bit). Dann sollte das kopieren aus dem DC in den Buffer schnell sein. Dann ist halt die Frage wie dein Code zur Auswertung strukturiert ist. Ggf. Kannst du mit Assembler optimieren.
Andere Frage: Was hast du vor? (z.B. bei Spielen gehts eventl in Ogl über glReadPixels schneller etc.) |
Ich dachte daran das möglicherweise im DC/TCanvas-Objekt schon die ganzen Pixel in irgendeiner Form gespeichert sind und man über irgendwelche Offsets auf diese zugreifen kann! Irgendwo her muss sich CopyRect ja auch die Pixel holen.
Passende API-Funktionen scheint es nicht zu geben!
Die Auswertung/Assembler ist auch nicht so das Problem, wie du schon sagtest ist es CopyRect!
Es gibt leider keine anderen Vorgehensweisen für mein Problem.
_________________ Debuggers don't remove bugs, they only show them in slow-motion.
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Sa 25.07.09 18:46
Copyrect wird nichts anderes als gdi32.BitBlt aufrufen (ungetestet). Das ruft dann die entsprechende Funktion im Kernel auf, die das dann kopiert.
ScanLine liefert dir die Adresse zurück auf die Zeile des Bildes im Speicher deines Programmes (welches mittels BitBlt kopiert wurde). Das ist halt nur ein "Screenshot".
Als alternative gibt es eben das hooken bzw. auslesen direkt aus dem Fremprozess. Wenn es sich z.b. um ein Bild handelt was du auslesen willst so wird das in irgeneiner Form dort im Zielprozess vorliegen. Das kannst du dann natürlich auch direkt mit ReadProcessMemory auslesen. Wenn das was du aber haben willst z.B. per gdi32.LineTo etc. ausgegeben wird musst du das hooken. Ist es z.B. ein OpenGL Programm kann man ggf die APIs hooken (glBegin / glVertex3f).
Du kannst jedenfalls nicht direkt auf die Bildschirmdaten aus deinem Programm aus zugreifen können, sondern musst diese a) in deinen Speicher kopieren (ReadProcessMemory aus dem Fremdprozesss, BitBlt als Screenshot über die WinAPI) oder dich aber in das Programm einklinken welches du überwachen willst und die verwendeten funktionen hooken (glBegin usw.)
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
Martok
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: Sa 25.07.09 18:52
uall@ogc hat folgendes geschrieben : | Du kannst jedenfalls nicht direkt auf die Bildschirmdaten aus deinem Programm aus zugreifen können, sondern musst diese a) in deinen Speicher kopieren (ReadProcessMemory aus dem Fremdprozesss, BitBlt als Screenshot über die WinAPI) |
Fällt mir grade mal ein: Doch, natürlich. Dafür gibts verschiedene Treiber-Tricks, vor allem sicher Mirror-Driver a la Mirage. Der wird auch von vielen VNCs genutzt...
VHScreenCap gibts auch noch, aber ob der sonderlich sinnoll ist wage ich noch zu bewzweifeln.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Sa 25.07.09 18:57
Ja auf Treiber bin ich jetzt nicht eingegangen. Und CopyRect verwendet StretchBlt gerade nachgeschaut.
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
SAiBOT 
      
Beiträge: 323
Erhaltene Danke: 6
XP SP2; 7
D7; D2009
|
Verfasst: Sa 01.08.09 18:30
_________________ Debuggers don't remove bugs, they only show them in slow-motion.
|
|