多屏幕截屏
逻辑
截屏的实现逻辑本次不予赘述,此次只谈论如何获取多个屏幕的 rect。
Desktopmagic 库对于获取多屏幕信息的实现如下:
main.py
from desktopmagic.screengrab_win32 import (getDisplayRects, getRectAsImage)
# 获取所有显示屏信息
screens = getDisplayRects()
# 类似与 PIL.ImageGrab.grab 操作
rect = getRectAsImage(screens[0])
rect.save('D:\\desktop\\pythonProject1\\leftscr_0.jpeg', format='jpeg')
对于 getDisplayRects
函数,Desktopmagic 的逻辑是,调用了 EnumDisplayMonitors 该方案的 python 封装在 PyEnumDisplayMonitors。需要注意的是, getDisplayRects
函数内部会对 PyEnumDisplayMonitors
的结果进行"裁剪",最终只会返回 每个屏幕的rect。
拿到每个屏幕的rect 就可以通过 PIL.ImageGrab
类似函数进行截屏。
代码
from desktopmagic.screengrab_win32 \
import (getDisplayRects, getRectAsImage)
from PIL import ImageGrab
import time
startTime = time.time_ns()
# getDisplayRects 函数会拿到当前所有显示器的rect [left_x, left_y, right_x, right_y]
# screens 是一个列表, 每一个元素都代表着一个显示器的 rect
screens = getDisplayRects()
# print(len(screens))
# for item in screens:
# print(item)
# imageGrab.grab 方法需要指定 all_screens 参数, 才能在 screens.rect 为负数的情况下正确截屏
image = ImageGrab.grab(bbox=screens[0], all_screens=True)
image.save("D:\\desktop\\pythonProject1\\ImageGrab_0.JPEG", format="JPEG")
endTime = time.time_ns()
print((endTime-startTime) / 1e9)
# image = ImageGrab.grab(bbox=screens[1], all_screens=True)
# image.save("D:\\desktop\\pythonProject1\\ImageGrab_1.JPEG", format="JPEG")
rect = getRectAsImage(screens[0])
rect.save('D:\\desktop\\pythonProject1\\leftscr_0.jpeg', format='jpeg')
endTime = time.time_ns()
print((endTime-startTime) / 1e9)
# rect = getRectAsImage(screens[1])
# rect.save('D:\\desktop\\pythonProject1\\leftscr_1.png', format='png')