Python中屏幕一小部分的快速截图



我目前正在做一个项目,我需要从屏幕的特定区域截取30x40像素的屏幕截图。这并不难,因为有很多方法可以做到这一点。

我的问题是,我需要采取大约10到15截图/秒的大小,我提到的。当我观察这些捕获屏幕的方法时,我发现当你给它们一个较小的选择参数时,就会涉及到裁剪。所以一个完整的截图正在被拍摄,然后该方法将其裁剪为给定的大小。如果我只打算使用30x40的图像,这似乎是浪费资源,特别是考虑到我将拍摄数千张截图。

所以我的问题是:是否有一种方法,只捕获屏幕的一部分,而不捕获整个屏幕切割所需的部分,从大屏幕截图?我现在正在使用这个命令:

im = pyautogui.screenshot(region=(0,0, 30, 40)).

Python mss模块(https://github.com/BoboTiG/python-mss, https://python-mss.readthedocs.io/examples.html)是一个使用ctypes(其中mss代表multiple Screen Shots)的纯Python超快速跨平台多屏幕截图模块,正是您正在寻找的。截图足够快,可以从视频中捕获帧,并且屏幕的部分越小,捕获速度越快(因此显然没有裁剪)。看看吧。mss.mss().grab()的性能远远优于PIL.ImageGrab.grab()。下面的代码示例展示了如何获取屏幕截图像素的数据(允许检测更改):

import mss
from time import perf_counter as T
left  = 0
right = 2
top   = 0
btm   = 2 
with mss.mss() as sct:
# parameter for sct.grab() can be: 
monitor = sct.monitors[1]         # entire screen
bbox    = (left, top, right, btm) # screen part to capture
sT=T()
sct_im = sct.grab(bbox) # type: <class 'mss.screenshot.ScreenShot'>
eT=T();print(" >", eT-sT) #  > 0.0003100260073551908
print(len(sct_im.raw), sct_im.raw) 
# 16 bytearray(b'-12xffx02DUxff-12xff"S_xff')

print(len(sct_im.rgb), sct_im.rgb) 
# 12 b'21-UDx0221-_S"'

最新更新