Python怎么实现全屏截图并保存为图片
在 Python 中实现全屏截图并保存为本地图片,核心思路是调用图形系统提供的接口捕获当前屏幕像素缓冲区,随后将其编码并写入目标文件。针对不同应用场景,主流工具有三类:基于图像处理生态的 Pillow (PIL)、专注于桌面自动化控制的 PyAutoGUI,以及面向高性能和多显示器捕获的 mss。本文将按实际操作流程逐一讲解具体实现代码与选择依据。
一、基础准备:安装截图所需的依赖库
Python 核心标准库本身未包含直接截取操作系统桌面的原生模块,因此需要安装成熟的第三方库。根据后续使用的方案,可在终端或命令行窗口中运行以下命令安装:
# 方案一所需:Python 图像处理核心库
pip install pillow
# 方案二所需:自动化控制库(内部依赖 Pillow)
pip install pyautogui
# 方案三所需:轻量极速截图库
pip install mss
二、方案一:使用 Pillow (PIL.ImageGrab) 实现全屏截图
Pillow 是 Python 中最常用的图像处理库。其内置的 ImageGrab 模块提供了直接抓取屏幕像素的方法。该方案代码极其精简,且返回的是原生的 PIL.Image 对象,便于截图后直接进行缩放、裁剪或添加文字标记。
1. 完整代码示例
from PIL import ImageGrab
# 1. 抓取当前全屏画面
screenshot = ImageGrab.grab()
# 2. 保存为本地图片文件
screenshot.save("fullscreen_pillow.png")
print("截图已保存至 fullscreen_pillow.png")
2. 代码关键细节解析
ImageGrab.grab()默认截取主屏幕完整分辨率内容。- 保存文件格式由传入文件名的后缀自动推断(如
.png、.jpg、.bmp)。如果保存为 JPG,可通过screenshot.save("out.jpg", quality=90)设置压缩质量。 - 平台兼容性:在 Windows 和 macOS 上表现良好;在 Linux 下,Pillow 依赖系统底层的 X11 会话,需确保已安装系统支持包。
三、方案二:使用 PyAutoGUI 实现快速截屏
PyAutoGUI 是一个跨平台的桌面自动化控制库,常用于编写脚本模拟键鼠动作。它的截屏功能经过高度封装,支持一条语句同时完成“截图并落盘”。
1. 完整代码示例
import pyautogui
# 一步完成:全屏截图并直接写入指定路径
screenshot = pyautogui.screenshot("fullscreen_pyautogui.png")
print("全屏截图已成功保存!")
也可以先获取图像对象,检查或修改后再执行保存:
import pyautogui
# 仅捕获到内存
img = pyautogui.screenshot()
# 执行尺寸检查或后续处理
print(f"屏幕图像分辨率: {img.size}")
# 保存到目标磁盘文件
img.save("fullscreen_custom.png")
四、方案三:使用 mss 实现高性能与多显示器截屏
当需要连续高频截屏、录屏,或在连接了多个显示器的扩展桌面环境下工作时,mss 是性能更强、处理更精准的专业选择。它直接与底层操作系统显示接口对接,开销极低。
1. 完整代码示例
import mss
import mss.tools
with mss.mss() as sct:
# sct.monitors[0] 代表包含所有屏幕的大全屏(虚拟总桌面)
# sct.monitors[1] 代表系统第 1 块物理主显示器
monitor_all = sct.monitors[0]
# 捕获像素数据
sct_img = sct.grab(monitor_all)
# 使用 mss 内置工具编码为 PNG 并保存
output_filename = "fullscreen_mss.png"
mss.tools.to_png(sct_img.rgb, sct_img.size, output=output_filename)
print(f"多屏虚拟全屏截图已保存为: {output_filename}")
五、跨平台底层原理与运行环境适配
全屏截图的底层实际上是操作系统显存读取权限的博弈。不同的操作系统在图形管线、权限控制机制及分辨率缩放上差异显著,了解这些原理有助于快速定位截图异常。
六、高频注意事项与排查技巧
1. Windows 高分屏 (DPI 缩放) 截图不全问题
在 Windows 10/11 系统中,若显示缩放比例设置高于 100%(如 125% 或 150%),运行部分截图脚本可能出现“只截取到了屏幕左上方一部分”或“图像尺寸小于实际物理分辨率”的现象。这是因为 Python 进程默认未启用 DPI 感知(DPI Unaware)。可在脚本头部显式开启 DPI 感知:
import sys
if sys.platform == "win32":
import ctypes
# 启用系统 Per-Monitor DPI 感知
try:
ctypes.windll.shcore.SetProcessDpiAwareness(2)
except Exception:
ctypes.windll.user32.SetProcessDPIAware()
2. macOS “屏幕录制” 隐私权限
macOS 从 Catalina (10.15) 开始引入了严格的安全限制。如果运行 Python 脚本的终端(Terminal、iTerm2)或 IDE(VS Code、PyCharm)未获得“屏幕录制”权限,截图接口可能不会报错,但保存出来的图片将是一张只有桌面壁纸、没有任何窗口内容的空图。解决方法:前往“系统设置 -> 隐私与安全性 -> 屏幕录制”,勾选当前使用的终端或 Python 解释器。
3. 输出图片体积控制与格式选择
- PNG 格式(推荐):无损压缩,文字、线条和界面 UI 图标边缘锐利清晰,适合作为教程配图或日志留档。
- JPG 格式:有损压缩,文件体积显著减小。若全屏画面色彩丰富(如游戏截图),保存为 JPG 能显著减轻存储与传输负担:
# 保存为 JPG 需注意转换为 RGB 模式(避免 PNG 携带的透明通道导致报错) rgb_img = screenshot.convert("RGB") rgb_img.save("screen.jpg", format="JPEG", quality=85)
七、方案总结与选型导图
针对“全屏截图并保存为图片”这一具体需求,总结如下决策思路:
综上所述,如果只是需要快速写几行脚本将当前屏幕保存为文件,Pillow 或 PyAutoGUI 是最便捷的选择;而在面对复杂的自动化系统或多显示器工作站时,结合 mss 并配合 DPI 与系统权限设置,能保证全屏截图稳定且高效地执行。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













