Какой самый быстрый способ сделать скриншот на Windows? PIL.ImageGrab
довольно медленный ... требуется от 4-5 секунд, чтобы сделать 30 скриншотов того же небольшого окна. Делать скриншоты всего рабочего стола еще медленнее.
Вы можете напрямую использовать Win32 API.
1) Сначала выберите приложение, скриншот которого хотите сделать. текст ссылки
2) Win32 API может помочь со скриншотом:
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())
Только что узнал, как это сделать с помощью gtk. На сегодняшний день кажется самым быстрым:
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
Без преобразования в образ PIL
это в 8 раз быстрее, чем PIL в моем тестовом примере. С преобразованием это все еще примерно в 2,7 раза быстрее.