当前位置: 首页 > news >正文

python-mss高级技巧:如何捕获多个显示器和指定区域

python-mss高级技巧:如何捕获多个显示器和指定区域

【免费下载链接】python-mssAn ultra fast cross-platform multiple screenshots module in pure Python using ctypes.项目地址: https://gitcode.com/gh_mirrors/py/python-mss

python-mss是一个超快速的跨平台多屏幕截图模块,纯Python编写,使用ctypes实现。它提供了简单而强大的API,让开发者能够轻松捕获单个显示器、多个显示器或屏幕上的特定区域。本文将分享如何利用python-mss的高级功能来实现多显示器和指定区域的截图捕获。

安装python-mss

要开始使用python-mss,首先需要安装它。可以通过pip命令轻松安装:

pip install mss

初始化MSS对象

使用python-mss的第一步是创建MSS对象。这个对象是所有截图操作的核心,它会自动检测系统中的所有显示器:

from mss import mss with mss() as sct: # 在这里进行截图操作 pass

使用上下文管理器(with语句)是推荐的方式,因为它会自动处理资源释放,确保不会有内存泄漏。

获取显示器信息

MSS对象的monitors属性提供了系统中所有显示器的信息。这是一个列表,其中第一个元素(索引0)代表所有显示器的组合区域,后续元素(索引1及以上)分别代表各个单独的显示器:

with mss() as sct: # 打印所有显示器信息 for i, monitor in enumerate(sct.monitors): print(f"显示器 {i}: {monitor}")

每个显示器信息是一个字典,包含以下键:

  • left: 显示器左上角的X坐标
  • top: 显示器左上角的Y坐标
  • width: 显示器宽度
  • height: 显示器高度

捕获多个显示器

捕获所有显示器

要捕获所有显示器的组合画面,只需使用monitors[0]

with mss() as sct: # 捕获所有显示器 screenshot = sct.grab(sct.monitors[0]) # 保存截图 mss.tools.to_png(screenshot.rgb, screenshot.size, output="all_monitors.png")

捕获特定显示器

要捕获特定的显示器,可以使用对应索引的显示器信息。例如,捕获第二个显示器(索引1):

with mss() as sct: # 捕获第二个显示器 monitor = sct.monitors[1] screenshot = sct.grab(monitor) # 保存截图 mss.tools.to_png(screenshot.rgb, screenshot.size, output="monitor_1.png")

捕获指定区域

除了捕获整个显示器,python-mss还允许捕获屏幕上的任意指定区域。只需定义一个包含lefttopwidthheight的字典或元组即可:

使用字典定义区域

with mss() as sct: # 定义要捕获的区域 (left, top, width, height) region = { "left": 100, "top": 100, "width": 400, "height": 300 } # 捕获指定区域 screenshot = sct.grab(region) # 保存截图 mss.tools.to_png(screenshot.rgb, screenshot.size, output="region.png")

使用元组定义区域

也可以使用元组(left, top, width, height)来定义区域:

with mss() as sct: # 定义要捕获的区域 (left, top, left+width, top+height) # 注意:元组的后两个值是右下角的坐标,而不是宽度和高度 region = (100, 100, 500, 400) # 等价于 left=100, top=100, width=400, height=300 # 捕获指定区域 screenshot = sct.grab(region) # 保存截图 mss.tools.to_png(screenshot.rgb, screenshot.size, output="region_tuple.png")

高级技巧:同时捕获多个区域

python-mss允许你同时捕获多个不同的区域。这在需要监控屏幕上多个特定区域时非常有用:

with mss() as sct: # 定义多个区域 regions = [ sct.monitors[1], # 第一个显示器 {"left": 100, "top": 100, "width": 200, "height": 200}, # 自定义区域1 (300, 300, 500, 500) # 自定义区域2 (元组形式) ] # 捕获并保存每个区域 for i, region in enumerate(regions): screenshot = sct.grab(region) mss.tools.to_png(screenshot.rgb, screenshot.size, output=f"region_{i}.png")

性能优化

python-mss以其速度著称,但在处理多个显示器或频繁截图时,仍有一些优化技巧可以进一步提升性能:

重用MSS对象

避免频繁创建和销毁MSS对象。在需要多次截图的场景中,重用同一个MSS对象可以显著提高性能:

with mss() as sct: for i in range(10): screenshot = sct.grab(sct.monitors[1]) mss.tools.to_png(screenshot.rgb, screenshot.size, output=f"screenshot_{i}.png")

使用适当的后端

python-mss会根据操作系统自动选择最佳后端,但你也可以手动指定:

# 在Linux上使用XSHM后端(通常更快) with mss(display=":0", backend="xshm") as sct: screenshot = sct.grab(sct.monitors[1])

实际应用示例

视频捕获

结合OpenCV,python-mss可以用于捕获屏幕视频:

import cv2 import numpy as np from mss import mss with mss() as sct: # 定义要捕获的区域 monitor = sct.monitors[1] # 创建视频编写器 fourcc = cv2.VideoWriter_fourcc(*"XVID") out = cv2.VideoWriter("output.avi", fourcc, 20.0, (monitor["width"], monitor["height"])) while True: # 捕获截图 screenshot = sct.grab(monitor) # 转换为OpenCV格式 frame = np.array(screenshot) frame = cv2.cvtColor(frame, cv2.COLOR_BGRA2BGR) # 写入视频 out.write(frame) # 显示结果 cv2.imshow("Screen Capture", frame) # 按'q'退出 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放资源 out.release() cv2.destroyAllWindows()

多进程截图

对于需要同时捕获多个区域的场景,可以使用多进程来提高效率:

from multiprocessing import Process, Queue from mss import mss def capture_region(queue, region, output): with mss() as sct: screenshot = sct.grab(region) mss.tools.to_png(screenshot.rgb, screenshot.size, output=output) queue.put(output) if __name__ == "__main__": queue = Queue() regions = [ {"left": 0, "top": 0, "width": 800, "height": 600}, {"left": 800, "top": 0, "width": 800, "height": 600} ] processes = [] for i, region in enumerate(regions): p = Process(target=capture_region, args=(queue, region, f"region_{i}.png")) processes.append(p) p.start() for p in processes: p.join() while not queue.empty(): print(f"已保存: {queue.get()}")

总结

python-mss提供了强大而灵活的API,使捕获多个显示器和指定区域变得简单。通过本文介绍的技巧,你可以轻松实现各种截图需求,从简单的单区域截图到复杂的多显示器视频捕获。无论是开发屏幕录制工具、监控应用还是自动化测试脚本,python-mss都是一个值得选择的高效工具。

要了解更多关于python-mss的信息,可以查阅官方文档和示例代码:

  • 官方文档:docs/source/index.rst
  • 示例代码:docs/source/examples
  • 源代码:src/mss

希望本文对你掌握python-mss的高级技巧有所帮助!如果你有任何问题或建议,欢迎在项目的issue页面提出。

【免费下载链接】python-mssAn ultra fast cross-platform multiple screenshots module in pure Python using ctypes.项目地址: https://gitcode.com/gh_mirrors/py/python-mss

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.jsqmd.com/news/483764/

相关文章:

  • 如何从零开始探索genai-llm-ml-case-studies:初学者必知的10个核心功能
  • 亚洲美女LoRA风格迁移边界测试:造相-Z-Image-Turbo对极端提示的鲁棒性
  • Monitorix高级配置:告警设置与性能优化的10个实用技巧
  • DarkForest与Pachi引擎对比:谁才是围棋AI领域的王者?
  • IPED云取证数据保留策略案例:设置保留期限的实用指南
  • 造相 Z-Image 基础教程:正向提示词输入规范+负向过滤技巧(附示例)
  • 签到盒Checkbox核心原理揭秘:JavaScript自动化签到技术详解
  • 55KB超轻量!Vanilla-Todo项目解析:原生HTML/CSS/JS的极致优化
  • Alpamayo-R1-10B效果实测:在100个长尾场景(动物横穿、鬼探头)中,安全规避率达91.7%
  • DSWaveformImage高级扩展:自定义波形渲染器开发指南
  • Mobile NixOS设备移植教程:如何为新硬件适配开源移动系统
  • 深入理解batt工作原理:守护进程如何智能管理电池充电
  • 2026年市场西北轻钢龙骨厂家推荐:吊顶轻钢龙骨值得信赖厂家推荐(精选) - 品牌宣传支持者
  • 如何优雅缓存React路由?react-router-cache-route高级用法指南
  • 如何快速使用Local PHP Security Checker:5分钟上手教程
  • 新手必看:Jitterbug快速入门,5分钟学会跨设备调试技巧
  • ps4-exploit-host常见问题解答:FAQ与故障排除实用技巧
  • 为什么选择Cryptol?探索密码学规范语言的核心优势
  • 如何用HybridPageKit实现复杂Hybrid内容页?开发者必看的实战教程
  • NFStream高级插件开发:从零开始创建自定义流量分析模块
  • 性能优化实践:使用utf8proc提升C语言项目的Unicode处理效率
  • Mocker vs 传统Mock框架:为什么它是Swift网络测试的最佳选择
  • TTLCache源码解析:ExpirationQueue如何高效管理过期数据?
  • 2026年诚信的吊顶石膏板厂家推荐:兰州纸面石膏板厂家采购参考指南 - 品牌宣传支持者
  • 如何使用mini-arm-os开发ARM内核?新手入门的5个关键步骤
  • 2026年比较好的1V1旅游公司推荐:纯玩旅游/云南旅游实用参考指南公司 - 品牌宣传支持者
  • 为什么选择Azure MCP Server?解锁Azure代理开发的强大能力
  • Olake架构深度剖析:分布式设计如何支撑大规模数据复制?
  • 深入理解PHP Language Server架构:从TreeAnalyzer到DefinitionResolver的实现原理
  • 2026年靠谱的青海旅行社品牌推荐:西北旅行社/新疆旅行社/私人定制旅行社口碑推荐 - 品牌宣传支持者