La forma más rápida de tomar una captura de pantalla con python en windows

¿Cuál es la forma más rápida de hacer una captura de pantalla en Windows? PIL.ImageGrab es bastante lento … toma entre 4-5 segundos tomar 30 capturas de pantalla en la misma ventana pequeña. Tomar capturas de pantalla de todo el escritorio es incluso más lento.

Podrías usar las APIs de win32 directamente.

1) Primero, enfóquese en la aplicación de la que desea realizar la captura de pantalla. Texto del enlace

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()) 

Acabo de descubrir cómo hacerlo con gtk. Parece más rápido por 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 una imagen PIL , es 8 veces más rápido que PIL en mi caso de prueba. Con la conversión, sigue siendo ~ 2.7x más rápido.