2017-02-01 7 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

첫 번째 해결 방법은 두 번째 이상의 사진을 제공해야합니다. 그러나 문제는 동일한 초 내에 발생하는 모든 사진을 덮어 쓰는 것입니다. 즉, 모두 동일한 파일 이름을 갖습니다. 내 컴퓨터에

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

, 이것은 다음과 같은 출력을 준 : 다음과 같이 두 번째의 1/10을 포함하는 파일 이름을 만들 수 있습니다이 문제를 얻으려면

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