一、python‑mss 库简介
python‑mss 是一款专注于极速屏幕截图的 Python 第三方库,核心用于跨平台屏幕捕获、区域截图、多显示器截图。其基于操作系统原生 API 实现截图逻辑,不依赖 PIL、OpenCV 等外部图像处理库,截图速度远超传统库。该库采用 MIT 开源许可证,可自由商用、修改与分发,优点是轻量、极速、跨平台、低内存占用,缺点是仅专注截图,不自带图像编辑功能。

二、python‑mss 安装方法
python‑mss 对 Python 环境兼容性极强,支持 Python 3.6 及以上版本,可在 Windows、macOS、Linux 三大操作系统正常运行,安装仅需一条 pip 命令,无需额外配置依赖环境。
打开电脑终端(Windows 用 CMD 或 PowerShell,macOS/Linux 用终端),执行以下安装命令:
pip install python-mss
若遇到网络卡顿导致安装失败,可切换国内 PyPI 镜像源加速安装:
pip install python-mss -i https://pypi.tuna.tsinghua.edu.cn/simple
安装完成后,可通过以下命令验证是否安装成功:
pip show python-mss
执行后若能看到库的版本、安装路径等信息,即代表安装无误,可直接进入代码使用环节。
三、python‑mss 核心功能与基础代码示例
3.1 快速获取全屏截图
python‑mss 最基础的功能就是全屏截图,无需复杂配置,导入库后创建截图对象,调用截图方法即可完成操作,代码简洁易懂,适合零基础开发者快速上手。
# 导入python-mss核心模块
import mss
import mss.tools
# 创建截图对象
with mss.mss() as sct:
# 获取默认显示器的全屏截图
screenshot = sct.grab(sct.monitors[0])
# 将截图保存为PNG图片
mss.tools.to_png(screenshot.rgb, screenshot.size, output="full_screen.png")
print("全屏截图已保存为 full_screen.png")
代码说明:
import mss和import mss.tools分别导入截图核心模块与图片保存工具模块;with mss.mss() as sct使用上下文管理器创建截图对象,无需手动释放资源,更安全;sct.monitors[0]代表获取所有显示器的全屏区域,单显示器环境下就是整个屏幕;sct.grab()方法执行截图操作,返回包含图像数据的对象;mss.tools.to_png()将截图的 RGB 数据转换为 PNG 格式并保存到本地。
运行代码后,会在脚本同级目录生成 full_screen.png 文件,即为当前屏幕的完整截图。
3.2 自定义区域截图(指定坐标截图)
实际使用中,我们往往不需要全屏截图,只需要截取屏幕上某一个指定区域,python‑mss 支持通过左上角坐标、宽度、高度精准控制截图范围,满足窗口截图、局部内容截取等场景。
import mss
import mss.tools
# 定义截图区域:left=左上角x坐标, top=左上角y坐标, width=宽度, height=高度
capture_area = {
"left": 100,
"top": 100,
"width": 800,
"height": 600
}
with mss.mss() as sct:
# 截取指定区域
area_img = sct.grab(capture_area)
# 保存截图
mss.tools.to_png(area_img.rgb, area_img.size, output="custom_area.png")
print(f"已截取区域:{capture_area},保存为 custom_area.png")
代码说明:
capture_area是一个字典,用于定义截图的位置和大小,四个参数缺一不可;left和top控制截图区域在屏幕上的起始位置,数值越大位置越靠右、靠下;width和height控制截图的宽度和高度,决定截图区域的大小;- 其余逻辑与全屏截图一致,仅将全屏区域替换为自定义区域。
开发者可根据自身需求修改字典内的数值,实现精准区域截取,比如截取浏览器某一块内容、软件某一个窗口等。
3.3 多显示器截图
对于使用双屏、三屏的办公或开发用户,python‑mss 提供了完善的多显示器支持,可以单独截取某一个显示器的画面,也可以截取所有显示器拼接画面,适配多屏工作场景。
import mss
import mss.tools
with mss.mss() as sct:
# 查看当前设备所有显示器信息
print("显示器信息:", sct.monitors)
# 截取第一个显示器(主显示器)画面
monitor_1 = sct.grab(sct.monitors[1])
mss.tools.to_png(monitor_1.rgb, monitor_1.size, output="monitor_1.png")
# 若有第二个显示器,可直接截取
if len(sct.monitors) > 2:
monitor_2 = sct.grab(sct.monitors[2])
mss.tools.to_png(monitor_2.rgb, monitor_2.size, output="monitor_2.png")
代码说明:
sct.monitors会返回一个列表,包含所有显示器的区域信息,列表第一个元素是所有显示器总区域;sct.monitors[1]代表主显示器,sct.monitors[2]代表副显示器,以此类推;- 代码中增加了判断逻辑,避免只有单显示器时运行报错,兼容性更强;
- 多屏截图的方法与单屏完全一致,仅需修改
monitors后的索引值。
运行代码后,终端会打印出当前设备的显示器数量与区域参数,同时自动保存对应显示器的截图文件。
3.4 实时获取截图数据(不保存本地)
python‑mss 不仅可以将截图保存到本地,还能直接获取截图的原始像素数据,配合 PIL、OpenCV 等库,可实现实时图像处理、屏幕识别、自动化操作等进阶功能,无需先保存再读取,效率更高。
import mss
import numpy as np
with mss.mss() as sct:
# 截取主显示器
img = sct.grab(sct.monitors[1])
# 将截图转换为numpy数组(方便后续图像处理)
img_np = np.array(img)
# 输出图片基本信息
print("截图形状(高, 宽, 通道):", img_np.shape)
print("截图像素数据类型:", img_np.dtype)
代码说明:
- 该示例引入
numpy库,将截图对象转换为数组,这是计算机视觉、图像识别的常用操作; sct.grab()返回的对象可直接转换为数组,无需额外转换步骤;- 转换后的数组包含屏幕画面的所有像素信息,可直接用于后续分析、标注、识别等操作;
- 此方式不生成本地图片,适合实时处理场景,比如游戏辅助、屏幕监控、自动化脚本等。
运行代码后,终端会打印出截图的尺寸、通道数等数据,证明已成功获取原始图像信息。
3.5 极速连续截图(模拟录屏功能)
凭借轻量化、高性能的优势,python‑mss 可实现高频率连续截图,配合循环语句,就能实现轻量级录屏效果,适合制作简单的屏幕录制脚本,无需安装专业录屏软件。
import mss
import mss.tools
import time
# 设置截图次数与间隔
capture_count = 10
interval = 0.5
with mss.mss() as sct() as sct:
monitor = sct.monitors[1]
for i in range(capture_count):
# 执行截图
frame = sct.grab(monitor)
# 按序号保存帧图片
filename = f"frame_{i+1:02d}.png"
mss.tools.to_png(frame.rgb, frame.size, output=filename)
print(f"已保存第 {i+1} 帧:{filename}")
# 等待指定时间
time.sleep(interval)
print(f"连续截图完成,共生成 {capture_count} 帧画面")
代码说明:
capture_count控制截图总次数,interval控制每帧之间的间隔时间,单位为秒;- 通过
for循环实现连续截图,文件名按序号排列,方便后续合成视频; time.sleep()用于控制截图频率,数值越小截图速度越快,越接近录屏效果;- 该代码可直接用于制作简易录屏脚本,后续可配合
cv2.VideoWriter将帧合成视频。
运行代码后,脚本会每隔 0.5 秒截取一次屏幕,共生成 10 张连续截图,可直观看到 python‑mss 的高速截图能力。
四、python‑mss 结合实际场景综合案例
4.1 场景需求
开发一款简易屏幕区域实时监控工具,实现功能:
- 自定义截取屏幕指定区域;
- 实时显示截图画面;
- 将实时画面保存为连续帧;
- 代码轻量化,不依赖重型库。
4.2 完整实现代码
import mss
import mss.tools
import numpy as np
import cv2
import time
def screen_monitor(left, top, width, height, save_frames=True, max_frames=30):
"""
屏幕区域实时监控函数
:param left: 区域左上角x坐标
:param top: 区域左上角y坐标
:param width: 截图宽度
:param height: 截图高度
:param save_frames: 是否保存帧图片
:param max_frames: 最大截图帧数
"""
# 定义截图区域
monitor_area = {"left": left, "top": top, "width": width, "height": height}
with mss.mss() as sct:
frame_count = 0
start_time = time.time()
while frame_count < max_frames:
# 极速截图
frame = sct.grab(monitor_area)
# 转换为OpenCV可识别的格式
frame_bgr = np.array(frame)
# 显示实时画面
cv2.imshow("Screen Monitor - 按ESC退出", frame_bgr)
# 保存帧图片
if save_frames:
mss.tools.to_png(frame.rgb, frame.size, output=f"monitor_frame_{frame_count+1:02d}.png")
frame_count += 1
# 按ESC键退出
if cv2.waitKey(1) & 0xFF == 27:
break
# 计算性能
cost_time = time.time() - start_time
fps = frame_count / cost_time
print(f"监控完成,总帧数:{frame_count},耗时:{cost_time:.2f}s,平均FPS:{fps:.1f}")
# 释放窗口
cv2.destroyAllWindows()
# 启动屏幕监控:截取(200,200)位置,宽1000高600的区域
if __name__ == "__main__":
screen_monitor(left=200, top=200, width=1000, height=600, save_frames=True, max_frames=50)
代码说明:
- 封装了
screen_monitor函数,支持自定义坐标、尺寸、是否保存、最大帧数,复用性极强; - 结合
OpenCV实现实时画面显示,窗口可直观看到截取区域的动态变化; - 加入 FPS 计算,可直观体现 python‑mss 的截图性能,普通电脑可轻松达到 30+ FPS;
- 支持按
ESC键提前退出,操作更人性化; - 全程仅依赖 python‑mss、numpy、cv2 三个库,轻量化且运行流畅。
运行代码后,会弹出实时监控窗口,同时自动保存截图帧,终端打印性能数据,完整实现轻量化屏幕监控功能。
相关资源
- Pypi地址:https://pypi.org/project/python-mss/
- Github地址:https://github.com/BoboTiG/python-mss
- 官方文档地址:https://python-mss.readthedocs.io/
关注我,每天分享一个实用的Python自动化工具。
