Schnellere Methode zum Lesen von Bildschirmpixeln in Python als PIL?

8

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)

    
ThantiK 04.01.2010, 05:41
quelle

4 Antworten

13

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 ...

verwenden

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.

    
YOU 04.01.2010, 06:45
quelle
7

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%     
Asmo Soinio 04.01.2010 10:25
quelle
3

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.

    
Seth 04.01.2010 06:04
quelle
1

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%

Ссылка

    
anlag 30.08.2016 07:59
quelle