Python:截取和保存屏幕截图的最快方法

jjj*_*ayn 3 python gtk ctypes pygtk python-imaging-library

我一直在努力想出一个脚本,让我每秒可以多次截取我的桌面。我用的是Win10。

皮尔:

from PIL import ImageGrab
import time

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

结果每张图像 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)
Run Code Online (Sandbox Code Playgroud)

结果每张图像 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())
Run Code Online (Sandbox Code Playgroud)

结果每张图像 1.01 秒。

然后我偶然发现了线程(在 Windows 上使用 python 截取屏幕截图的最快方法),有人建议 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')
Run Code Online (Sandbox Code Playgroud)

结果每张图像 2.34 秒。

在我看来,我做错了什么,因为人们使用 gtk 取得了很好的结果。

任何建议如何加快进程?

谢谢!

Mar*_*ans 5

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

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') 
Run Code Online (Sandbox Code Playgroud)

在我的机器上,这给出了以下输出:

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') 
Run Code Online (Sandbox Code Playgroud)

  • 注意:“ImageGrab”仅适用于 macOS 和 Windows (2认同)
  • @WinEunuuchs2Unix,感谢您的通知。事实上,现在 `ImageGrab` 从 7.1.0 版本(2020 年 2 月 23 日左右发布)开始确实支持 X11。我会尝试一下“ImageGrab”。 (2认同)