Zurzeit verwende ich einen Pixel-Reader über AutoItv3, um einige Aktionen in einem Programm auszuführen, das direkt X ausführt; Ein Spiel. Im Moment funktioniert das Programm gut, aber als Übung habe ich es in Python umgeschrieben. Gerade jetzt kann ich tun:
%Vor%Und das packt die Pixelinfo, die ich will, einfach gut, aber ich mache das ziemlich schnell (muss 3x oder schneller gemacht werden), aber das Ergebnis ist, dass es die Framerate dieses DirectX-basierten Spiels stark beeinflusst .
Gibt es in Python einen schnelleren Weg, ein bestimmtes Bildschirmpixel zu lesen? Auch wenn man diese auf 0,3 Sekunden begrenzt, verursacht dies mehr Belastung, als sie eigentlich sollte (ich dachte eigentlich, dass Python schneller wäre als AutoIt für diesen speziellen Zweck, daher der Grund, warum ich es versuche)
Dies ist die PBS-Quelle, die keine Parameter akzeptiert und die den gesamten Bildschirm einnimmt und in Bitmap konvertiert.
%Vor%Also, wenn ich nur ein wenig tief gehe, ist der gefundene C-Ansatz gut
Und Python haben ctypes, also hier ist mein Ansatz mit ctypes
%Vor%Sie könnten einen Wrapper für die Funktion GetPixel schreiben wie folgt
%Vor% Dann können Sie wie getpixel(0,0)
, getpixel(100,0)
, etc ...
PS: Meine ist Windows 2000, also gebe ich winnt
in den Pfad ein, du musst es vielleicht in windows
ändern oder du solltest den Pfad komplett entfernen, nur mit user32.dll
und gdi32.dll
sollte arbeite auch.
Kommentar zur Lösung von S.Mark: Die Bibliothek user32 ist bereits von windll in windll.user32 geladen, also können Sie anstelle der Zeile dc = ... Folgendes tun:
%Vor%... oder vorzugsweise:
%Vor%Sie können dies möglicherweise über SDL (?) tun. Basierend auf dieser Frage kann SDL auf den Bildschirm zugreifen. Und es hat Python-Bindungen.
Könnte es einen Versuch wert sein? Wenn es funktioniert, wäre es sicherlich schneller als eine Vollbildaufnahme in PIL.
Das ist eine alte Frage, aber bei Google steht sie bei der Suche nach Python-Screenshot-Methoden ziemlich hoch. Ich denke, es könnte nützlich sein, zu erwähnen, dass das ImageGrab-Modul jetzt eine Region des Bildschirms unterstützt:
%Vor%Erweitern Sie den Bereich leicht, gibt es jetzt auch einen Ersatz für ImageGrab namens pyscreenshot, der auch einen Teil des Bildschirms in ein oder PIL / Pillow-Bild speichert. Dieses Modul funktioniert auch unter Linux, im Gegensatz zu ImageGrab, das nur Windows und OS X ist.
%Vor%Tags und Links python windows python-imaging-library winapi directx