Python:获取和保存截图的最快方式 [英] Python: Fastest way to take and save screenshots

查看:218
本文介绍了Python:获取和保存截图的最快方式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在努力想出一个脚本,允许我每秒钟不止一次地截取桌面的屏幕截图。我使用Win10。



PIL:

  from PIL import ImageGrab 
导入时间

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

结果每张图片1.01秒。



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

 进口pyscreeze 
进口时间

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

结果为每张图片1.00秒。

Win32:

 进口win32gui 
进口win32ui
进口win32con
进口时间

w = 1920 #res
h = 1080 #res

,而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秒。



然后我偶然发现了线索(最快的方法在窗口中使用python截图),其中建议gtk会产生惊人的结果。



但是使用gtk:

 进口gtk 
进口时间

img_width = gtk.gdk.screen_width()
img_height = gtk.gdk 。屏幕_height()

,而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获得了很好的结果。



谢谢!

解决方案

你的第一个解决方案应该是每秒给你一张以上的照片。但问题是,你将覆盖同一秒内发生的任何图片,即它们将具有相同的文件名。为了解决这个问题,您可以创建包含十分之一秒的文件名,如下所示:

  from PIL import ImageGrab 
from datetime导入日期时间

,而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


I've been struggling to come up with a script that allows me to take screenshots of my desktop more than once per every second. I'm using Win10.

PIL:

from PIL import ImageGrab
import time

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

Results 1.01 seconds per image.

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

import pyscreeze
import time

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

Results 1.00 seconds per image.

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

Results 1.01 seconds per image.

Then I stumbled into thread (Fastest way to take a screenshot with python on windows) where it was suggested that gtk would yield phenomenal results.

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

Results 2.34 seconds per image.

It seems to me like I'm doing something wrong, because people have been getting great results with gtk.

Any advices how to speed up the process?

Thanks!

解决方案

Your first solution should be giving you more than one picture per second. The problem though is that you will be overwriting any pictures that occur within the same second, i.e. they will all have the same filename. To get around this you could create filenames that include 10ths of a second as follows:

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

On my machine, this gave the following output:

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

这篇关于Python:获取和保存截图的最快方式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆