Schnellere Methode zum Lesen von Bildschirm-pixel in Python als PIL?
Derzeit bin ich mit einem pixel-reader über AutoItv3, um einige Aktionen in einem Programm, das ausgeführt wird, direct X, Ein Spiel. Jetzt funktioniert das Programm einwandfrei, aber als eine übung, die ich habe schreiben Sie es in python. Jetzt kann ich tun:
import ImageGrab # Part of PIL
image = ImageGrab.grab() #Define an area to capture.
rgb = image.getpixel((1, 90)) #What pixel do we want?
Und packt die pixel info ich will einfach nur in Ordnung, aber ich bin dabei ziemlich schnell (muss getan werden 3x pro Sekunde oder schneller), aber das Ergebnis ist, dass es hauptsächlich betrifft die framerate von diesem DirectX-basiertes Spiel.
Gibt es einen schnelleren Weg in Python zu Lesen, dass ein bestimmtes pixel auf dem Bildschirm? Auch die Begrenzung dieses hier laufen alle 0.3 Sekunden verursacht mehr Belastung, als es eigentlich sollte (die ich eigentlich dachte python wäre schneller als AutoIt für diesen bestimmten Zweck, daher der Grund, warum ich versuche es)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist der PIL s grabscreen Quelle, Ihr akzeptiert keine Parameter und Dessen greifen Sie den gesamten Bildschirm und konvertieren in bitmap.
So, wenn ich nur ein wenig tief, gefunden C Ansatz ist gut
http://msdn.microsoft.com/en-us/library/dd144909(VS.85).aspx
Python und hat ctypes, also hier ist mein Ansatz mit ctypes (in Windows 10,
winnt
wurde ersetzt mitWindows
):Könnten Sie schreiben einen wrapper für die Funktion GetPixel wie diese
Dann können Sie verwenden, wie
getpixel(0,0)
,getpixel(100,0)
usw...PS: bei Mir ist Windows 2000, also setzte ichwinnt
im Weg, müssen Sie möglicherweise zu ändern, umwindows
oder man sollte vollständig zu entfernen Weg, nur mituser32.dll
undgdi32.dll
sollten auch funktionieren.Kommentar auf S. Mark ' s Lösung: user32 Bibliothek bereits geladen windll in windll.user32, also statt der dc = ... Zeile, die Sie tun können:
...oder am besten:
cdll.user32.GetDC(0)
heute morgen, es hat nicht funktioniert, so dass ich den Import von dll-Dateien manuell.Könnten Sie in der Lage sein, es zu tun via SDL (?). Basierend auf diese Frage, SDL können auf den Bildschirm. Und es hat python-bindings.
Vielleicht einen Versuch Wert? Wenn es funktionierte, würde es natürlich schneller sein, als bei einem Vollbild-capture in PIL.
Es ist eine alte Frage, aber es zählt ganz hoch auf Google bei der Suche nach Python Standbild Methoden, so dass ich denke, es könnte nützlich sein, zu erwähnen, dass die ImageGrab-Modul unterstützt jetzt packte einen Bereich des Bildschirms:
http://pillow.readthedocs.io/en/3.1.x/reference/ImageGrab.html
Ausweitung des Anwendungsbereichs leicht, es gibt jetzt auch ein Ersatz für ImageGrab genannt pyscreenshot, auch das spart einen Teil des Bildschirms, um ein-oder PIL/Kissen Bild. Dieses Modul funktioniert auch unter Linux, im Gegensatz zu ImageGrab, die Windows und OS X nur.
https://pypi.python.org/pypi/pyscreenshot