2010-08-27 7 views
13

Qual è il modo più veloce per fare uno screenshot su Windows? PIL.ImageGrab è piuttosto lento .. ci vogliono tra 4-5 secondi per scattare 30 screenshot della stessa piccola finestra. Fare screenshot dell'intero desktop è ancora più lento.Il modo più veloce per fare uno screenshot con python su windows

+0

Suono come quello che si desidera veramente sono i video su schermo, a la CamStudio su Sourceforge. Qual è il caso d'uso? –

+7

per ottenere il punteggio più alto di sempre su [winterbells] (http://www.ferryhalim.com/orisinal/g3/bells.htm) = P – Claudiu

risposta

23

È possibile utilizzare direttamente le API di win32.

1) Dare innanzitutto l'attenzione all'app di cui si desidera acquisire uno screenshot. link text

2) Win32 API può aiutare con lo screenshot:

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

MOLTO IMPORTANTE, poiché recentemente mi ha morso nel culo: DEVI cancellare/rilascia tutti i DC creati da questo, o dopo aver preso ~ 90 immagini, non sarai più in grado di farlo. in questo caso, 'dcObj.DeleteDC(); cDC.DeleteDC(); win32gui.ReleaseDC (hwnd, wDC) ' – Claudiu

+0

Si prega di aggiungere le importazioni necessarie affinché questo codice funzioni. –

+0

Vedi questo script per maggiori dettagli: http://bytes.com/topic/python/answers/576924-win32ui-vs-wxpy-screen-capture-multi-monitor –

3

appena scoperto come farlo con GTK. Sembra più veloce in assoluto:

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 

Senza la conversione in un PIL immagine, è 8x più veloce di PIL sul mio banco di prova. Con la conversione, è ancora ~ 2.7 volte più veloce.

+4

cosa è get_rect? – denfromufa

Problemi correlati