2010-08-27 4 views
13

Was ist der schnellste Weg, um einen Screenshot auf Windows zu machen? PIL.ImageGrab ist ziemlich langsam .. es dauert zwischen 4-5 Sekunden, um 30 Screenshots des gleichen kleinen Fensters zu machen. Das Erstellen von Screenshots des gesamten Desktops ist noch langsamer.Der schnellste Weg, um einen Screenshot mit Python auf Windows

+0

Sound wie, was Sie wirklich wollen, sind Bildschirm Videos, a la CamStudio auf Sourceforge. Was ist der Anwendungsfall? –

+7

, um die höchste Punktzahl jemals auf [Winterbells] (http://www.ferryhalim.com/orisinal/g3/belles.htm) = P – Claudiu

Antwort

23

Sie können Win32-APIs direkt verwenden.

1) Geben Sie zuerst den Fokus auf die App, von der Sie einen Screenshot machen möchten. link text

2) Win32 API kann mit dem Screenshot helfen:

import win32gui 
import win32ui 
hwnd = win32gui.FindWindow(None, windowname) 
wDC = win32gui.GetWindowDC(hwnd) 
dcObj=win32ui.CreateDCFromHandle(wDC) 
cDC=dcObj.CreateCompatibleDC() 
dataBitMap = win32ui.CreateBitmap() 
dataBitMap.CreateCompatibleBitmap(dcObj, w, h) 
cDC.SelectObject(dataBitMap) 
cDC.BitBlt((0,0),(w, h) , dcObj, (0,0), win32con.SRCCOPY) 
dataBitMap.SaveBitmapFile(cDC, bmpfilenamename) 
# Free Resources 
dcObj.DeleteDC() 
cDC.DeleteDC() 
win32gui.ReleaseDC(hwnd, wDC) 
win32gui.DeleteObject(dataBitMap.GetHandle()) 
+10

SEHR WICHTIG, wie dies vor kurzem mir in den Arsch gebissen: Sie müssen löschen/Lassen Sie alle erstellten DCs frei, oder nachdem Sie ~ 90 Bilder aufgenommen haben, werden Sie nicht mehr in der Lage sein. In diesem Fall 'dcObj.DeleteDC(); cDC.DeleteDC(); win32gui.ReleaseDC (hwnd, wDC) ' – Claudiu

+0

Fügen Sie die erforderlichen Importe hinzu, damit dieser Code funktioniert. –

+0

Sehen Sie dieses Skript für weitere Details: http://bytes.com/topic/python/answers/576924-win32ui-vs-wxpy-screen-capture-multi-monitor –

3

gerade herausgefunden, wie es mit gtk zu tun. Scheint schnellste weit von:

def image_grab_gtk(window): 
    left, top, right, bot = get_rect(window) 
    w = right - left 
    h = bot - top 

    s = gtk.gdk.Pixbuf(
     gtk.gdk.COLORSPACE_RGB, False, 8, w, h) 

    s.get_from_drawable(
     gtk.gdk.get_default_root_window(), 
     gtk.gdk.colormap_get_system(), 
     left, top, 0, 0, w, h) 

    final = Image.frombuffer(
     "RGB", 
     (w, h), 
     s.get_pixels(), 
     "raw", 
     "RGB", 
     s.get_rowstride(), 1) 
    return final 

Ohne sich auf eine PIL Bild umwandelt, es als PIL auf meinem Testfall 8x schneller ist. Beim Konvertieren ist es immer noch ~ 2.7x schneller.

+4

Was ist get_rect? – denfromufa