2010-08-27 627 views
13

¿Cuál es la manera más rápida de tomar una captura de pantalla en Windows? PIL.ImageGrab es bastante lento ... tarda entre 4 y 5 segundos para tomar 30 capturas de pantalla de la misma ventana pequeña. Tomar capturas de pantalla de todo el escritorio es aún más lento.La forma más rápida de tomar una captura de pantalla con Python en Windows

+0

Suena como lo que realmente quieres son videos de pantalla, a la CamStudio en Sourceforge. ¿Cuál es el caso de uso? –

+7

para obtener el puntaje más alto en [winterbells] (http://www.ferryhalim.com/orisinal/g3/bells.htm) = P – Claudiu

Respuesta

23

Puede usar win32 APIs directamente.

1) En primer lugar preste atención a la aplicación de la que desea tomar la captura de pantalla. link text

2) Win32 API puede ayudar con la captura de pantalla:

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

MUY IMPORTANTE, ya que esto me ha mordido recientemente el culo: TIENES QUE borrar/suelte todos los DC creados por esto, o después de tomar ~ 90 imágenes, ya no podrá. en este caso, 'dcObj.DeleteDC(); cDC.DeleteDC(); win32gui.ReleaseDC (hwnd, wDC) ' – Claudiu

+0

Agregue las importaciones necesarias para que funcione este código. –

+0

Vea este script para más detalles: http://bytes.com/topic/python/answers/576924-win32ui-vs-wxpy-screen-capture-multi-monitor –

3

acaba de encontrar la manera de hacerlo con GTK. Parece más rápido, con mucho:

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 

sin convertir a un PIL imagen, es 8x más rápido que el PIL en mi caso de prueba. Con la conversión, todavía es ~ 2.7x más rápido.

+4

¿Qué es get_rect? – denfromufa

Cuestiones relacionadas