yox*_*all 0 python screenshot image image-processing python-3.x
我目前正在开发一个项目,需要从屏幕的特定区域截取 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 的纯 Python 超快速跨平台多个屏幕截图模块(其中 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"'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3728 次 |
| 最近记录: |