2017-02-01 24 views
1

Я изо всех сил старался придумать сценарий, который позволяет мне снимать скриншоты моего рабочего стола более одного раза в секунду. Я использую Win10.Python: Самый быстрый способ взять и сохранить скриншоты

PIL:

from PIL import ImageGrab 
import time 

while True: 
    im = ImageGrab.grab() 
    fname = "dropfolder/%s.png" %int(time.time()) 
    im.save(fname,'PNG') 

Результаты 1.01 секунды за изображение.

PyScreeze (https://github.com/asweigart/pyscreeze):

import pyscreeze 
import time 

while True: 
    fname = "dropfolder/%s.png" %int(time.time()) 
    x = pyscreeze.screenshot(fname) 

Результаты 1.00 секунды за изображение.

Win32:

import win32gui 
import win32ui 
import win32con 
import time 

w=1920 #res 
h=1080 #res 

while True: 
    wDC = win32gui.GetWindowDC(0) 
    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) 
    fname = "dropfolder/%s.png" %int(time.time()) 
    dataBitMap.SaveBitmapFile(cDC, fname) 
    dcObj.DeleteDC() 
    cDC.DeleteDC() 
    win32gui.ReleaseDC(0, wDC) 
    win32gui.DeleteObject(dataBitMap.GetHandle()) 

Результаты 1.01 секунды за изображение.

Затем я наткнулся на нить (Fastest way to take a screenshot with python on windows), где было высказано предположение, что gtk даст феноменальные результаты.

Однако при использовании GTK:

import gtk 
import time 

img_width = gtk.gdk.screen_width() 
img_height = gtk.gdk.screen_height() 

while True: 
    screengrab = gtk.gdk.Pixbuf(
     gtk.gdk.COLORSPACE_RGB, 
     False, 
     8, 
     img_width, 
     img_height 
    ) 

    fname = "dropfolder/%s.png" %int(time.time()) 
    screengrab.get_from_drawable(
     gtk.gdk.get_default_root_window(), 
     gtk.gdk.colormap_get_system(), 
     0, 0, 0, 0, 
     img_width, 
     img_height 
     ).save(fname, 'png') 

Результаты 2,34 секунд для каждого изображения.

Мне кажется, что я делаю что-то неправильно, потому что люди добиваются отличных результатов с помощью gtk.

Любые советы, как ускорить процесс?

Спасибо!

+0

Как быстро вы надеетесь получить? –

ответ

2

Ваше первое решение должно давать вам более одного изображения в секунду. Проблема состоит в том, что вы будете переписывать любые изображения, которые происходят в течение одной секунды, т. Е. Все они будут иметь одинаковое имя файла. Чтобы обойти эту проблему, вы можете создать имена файлов, которые включают в себя 10ths секунды следующим образом:

from PIL import ImageGrab 
from datetime import datetime 

while True: 
    im = ImageGrab.grab() 
    dt = datetime.now() 
    fname = "pic_{}.{}.png".format(dt.strftime("%H%M_%S"), dt.microsecond // 100000) 
    im.save(fname, 'png') 

На моей машине, это дало следующий результат:

pic_1143_24.5.png 
pic_1143_24.9.png 
pic_1143_25.3.png 
pic_1143_25.7.png 
pic_1143_26.0.png 
pic_1143_26.4.png 
pic_1143_26.8.png 
pic_1143_27.2.png 

 Смежные вопросы

  • Нет связанных вопросов^_^