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 取得了很好的结果。
任何建议如何加快进程?
谢谢!
您的第一个解决方案应该每秒给您多张图片。但问题是您将覆盖同一秒内出现的任何图片,即它们都将具有相同的文件名。为了解决这个问题,您可以创建包含十分之一秒的文件名,如下所示:
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)
| 归档时间: |
|
| 查看次数: |
6311 次 |
| 最近记录: |