Fastest way to take a screenshot with python on windows
You could use win32 APIs directly .
First give the focus to the App that you want to take screenshot of.link text
Win32 API can help with the screenshot:
import win32guiimport win32uiimport win32conw = 1920 # set thish = 1080 # set thisbmpfilenamename = "out.bmp" #set thishwnd = 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 ResourcesdcObj.DeleteDC()cDC.DeleteDC()win32gui.ReleaseDC(hwnd, wDC)win32gui.DeleteObject(dataBitMap.GetHandle())
Just found out how to do it with gtk. Seems fastest by far:
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
Without converting to a PIL
Image, it's 8x faster than PIL on my test case. With converting, it's still ~2.7x faster.
You can use package mss:
Save screenshot to image file
import msswith mss.mss() as sct: filename = sct.shot(output="output.png")
Get the numpy representation of screenshot
import mssimport numpy as npwith mss.mss() as sct: monitor = {"top": 160, "left": 160, "width": 160, "height": 135} img_array = np.array(sct.grab(monitor)) # Do whatever you want...