我目前正在做一个项目,在这个项目中,我需要从屏幕的特定区域拍摄一个30x40像素的屏幕快照。这并不难做到,因为有很多方法可以做到这一点。
我的问题是,我需要采取大约10至15屏幕截图/秒,我提到的大小。当我查看一些捕捉屏幕的方法时,我已经看到,当您为更小的选择提供参数时,就会涉及到裁剪。因此,一个完整的屏幕截图正在进行,然后该方法将其种植到给定的大小。如果我只使用30x40图像,这似乎是浪费资源,特别是考虑到我将拍摄数千张截图。
因此,我的问题是:是否有一种方法只捕获屏幕的一部分而不捕获整个屏幕,从大屏幕截图中删除所需的部分?我目前正在使用以下命令:
im = pyautogui.screenshot(region=(0,0, 30, 40))
。
发布于 2022-05-28 00:57:40
Python模块( https://github.com/BoboTiG/python-mss,https://python-mss.readthedocs.io/examples.html )是纯Python中使用ctype( mss代表多个屏幕截图)的超高速跨平台多屏幕截图模块,是您所要寻找的。截图的速度足够快,可以从视频中捕获帧,并且屏幕上的部分越小,抓取的速度就越快(因此显然不需要剪切)。看看这个。到目前为止,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'-12\xff\x02DU\xff-12\xff"S_\xff')
print(len(sct_im.rgb), sct_im.rgb)
# 12 b'21-UD\x0221-_S"'
https://stackoverflow.com/questions/72410958
复制相似问题