Python 中一小部分屏幕的快速截图
Fast screenshot of a small part of the screen in Python
我目前正在做一个项目,我需要从屏幕的特定区域截取 30x40 像素的屏幕截图。这并不难做到,因为有很多方法可以做到这一点。
我遇到的问题是我需要取我提到的尺码的大约 10 到 15 screenshots/second。当我查看其中一些捕获屏幕的方法时,我发现当您为较小的选择提供参数时,会涉及裁剪。所以正在截取完整的屏幕截图,然后该方法将其裁剪为给定的大小。如果我只打算使用 30x40 图像,这似乎是一种资源浪费,尤其是考虑到我将截取数千张屏幕截图。
所以我的问题是:有没有一种方法可以只捕获屏幕的一部分而不捕获整个屏幕从大屏幕截图中剪切出所需的部分?我目前正在使用这个命令:
im = pyautogui.screenshot(region=(0,0, 30, 40))
.
Python mss 模块 ( https://github.com/BoboTiG/python-mss , https://python-mss.readthedocs.io/examples.html ),一个超快速 cross-platform 多屏幕截图模块,纯 Python 使用 ctypes(其中 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"'
我目前正在做一个项目,我需要从屏幕的特定区域截取 30x40 像素的屏幕截图。这并不难做到,因为有很多方法可以做到这一点。
我遇到的问题是我需要取我提到的尺码的大约 10 到 15 screenshots/second。当我查看其中一些捕获屏幕的方法时,我发现当您为较小的选择提供参数时,会涉及裁剪。所以正在截取完整的屏幕截图,然后该方法将其裁剪为给定的大小。如果我只打算使用 30x40 图像,这似乎是一种资源浪费,尤其是考虑到我将截取数千张屏幕截图。
所以我的问题是:有没有一种方法可以只捕获屏幕的一部分而不捕获整个屏幕从大屏幕截图中剪切出所需的部分?我目前正在使用这个命令:
im = pyautogui.screenshot(region=(0,0, 30, 40))
.
Python mss 模块 ( https://github.com/BoboTiG/python-mss , https://python-mss.readthedocs.io/examples.html ),一个超快速 cross-platform 多屏幕截图模块,纯 Python 使用 ctypes(其中 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"'