如何用Python实现屏幕截图?从基础到进阶的完整案例指南
目录导读
- 引言:为什么选择Python进行屏幕截图?
- 核心库介绍与安装
- 基础案例:使用PIL/Pillow截图全屏
- 进阶案例:使用PyAutoGUI截图指定区域
- 高效案例:使用mss实现多屏幕截图
- 实战案例:定时截图与图像处理
- 常见问题与问答(FAQ)
- 总结与最佳实践
引言:为什么选择Python进行屏幕截图?
屏幕截图是自动化测试、数据监控、UI记录、甚至远程协助中的基础需求,Python凭借其丰富的第三方库生态,能轻松实现跨平台的屏幕截图,且代码量极少,从简单的全屏截图到复杂的多屏、区域截图、实时处理,Python都能胜任,本文将用多个可运行的案例,手把手教你如何用Python案例实现屏幕截图,并涵盖从安装到优化的完整流程。

核心库介绍与安装
Python中常用的截图库主要有三个:
- PIL (Pillow):最老牌、功能最全的图像处理库,支持截图、编辑、保存。
- PyAutoGUI:专注于自动化控制,内置截图功能,适合区域截图。
- mss (Multiple Screen Shot):高性能、支持多屏幕,适用于快速连续截图。
安装命令:
pip install Pillow pyautogui mss
提示:在Linux上可能需要额外安装依赖(如
scrot),Windows和macOS通常直接可用。
基础案例:使用PIL/Pillow截图全屏
代码示例
from PIL import ImageGrab
import datetime
# 全屏截图
screenshot = ImageGrab.grab()
# 自动命名为时间戳
filename = f"screenshot_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.png"
screenshot.save(filename)
print(f"截图已保存:{filename}")
扩展说明
ImageGrab.grab()无参数时截取整个屏幕。- 可以传入bbox参数(left, top, right, bottom)截取指定区域。
- 支持直接保存为JPEG、PNG等格式。
进阶案例:使用PyAutoGUI截图指定区域
代码示例:截取鼠标点击区域
import pyautogui
import time
# 等待3秒,让你移动鼠标到目标区域
print("请将鼠标移动到要截图区域的左上角,程序将在3秒后开始...")
time.sleep(3)
x1, y1 = pyautogui.position()
print(f"左上角坐标:({x1}, {y1})")
print("请将鼠标移动到右下角...")
time.sleep(3)
x2, y2 = pyautogui.position()
print(f"右下角坐标:({x2}, {y2})")
# 计算并截图
region = (x1, y1, x2-x1, y2-y1)
screenshot = pyautogui.screenshot(region=region)
screenshot.save("selected_area.png")
print("区域截图完成!")
关键点
pyautogui.screenshot(region=(x, y, width, height))中的region参数是 (左上x, 左上y, 宽度, 高度)。- 适合需要人工选择截取区域的场景。
高效案例:使用mss实现多屏幕截图
代码示例:截取所有显示器
import mss
import mss.tools
with mss.mss() as sct:
# 获取所有显示器信息
monitors = sct.monitors
print(f"检测到 {len(monitors)-1} 个显示器:")
for i, monitor in enumerate(monitors[1:], 1):
print(f"显示器 {i}: {monitor['width']}x{monitor['height']}")
# 截图每个显示器
sct_img = sct.grab(monitor)
mss.tools.to_png(sct_img.rgb, sct_img.size, output=f"monitor_{i}.png")
优势
- 支持实时多屏,速度极快(每秒可达30帧)。
- 捕获的图片是原始RGB数据,可直接用于OpenCV处理。
实战案例:定时截图与图像处理
场景:每隔5分钟截图,并添加时间水印
import schedule
import time
from PIL import ImageGrab, ImageDraw, ImageFont
import datetime
def screenshot_with_watermark():
# 截图
img = ImageGrab.grab()
draw = ImageDraw.Draw(img)
# 添加时间水印
now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 使用默认字体,颜色红色
draw.text((10, 10), now, fill=(255, 0, 0))
# 保存
filename = f"timed_{now.replace(':', '-')}.png"
img.save(filename)
print(f"已保存:{filename}")
# 每5分钟执行一次
schedule.every(5).minutes.do(screenshot_with_watermark)
print("定时截图启动,每5分钟一次,按Ctrl+C停止...")
while True:
schedule.run_pending()
time.sleep(1)
扩展思路
- 可以结合OpenCV进行OCR识别、图像对比。
- 可用于网站监控、股票看盘等需要定时记录屏幕变化的场景。
常见问题与问答(FAQ)
Q1:截图时出现黑色窗口或空白?
A:这通常发生在系统有高DPI缩放或图形加速的情况,尝试使用mss库,它对硬件加速的兼容性更好,检查是否截图了被遮挡的窗口。
Q2:如何只截取某个窗口,而非整个屏幕?
A:结合pygetwindow库获取窗口坐标,再用pyautogui截图,示例:
import pygetwindow as gw
import pyautogui
win = gw.getWindowsWithTitle('记事本')[0] # 替换为实际窗口标题
x, y, w, h = win.left, win.top, win.width, win.height
pyautogui.screenshot(region=(x, y, w, h)).save("window.png")
Q3:如何提高截图速度?
A:使用mss库,如果不需要图片处理,直接保存原始数据流,避免使用PIL的ImageGrab进行连续截图。
Q4:截图后如何直接发送给API或邮件?
A:保存为二进制流,用requests或smtplib发送。
import io from PIL import ImageGrab img = ImageGrab.grab() buffer = io.BytesIO() img.save(buffer, format='PNG') # 发送buffer.getvalue()
总结与最佳实践
通过以上案例,你已经掌握了Python实现屏幕截图的三种主流方法:
- PIL/Pillow:全能型,适合简单截图+图像处理。
- PyAutoGUI:适合自动化流程,可配合鼠标点击、区域选择。
- mss:高性能首选,多屏、实时截图场景最强。
最佳实践建议:
- 对于快速开发,优先用
pyautogui;对于生产环境,用mss。 - 截取区域时,使用相对坐标(如百分比)以提高跨屏兼容性。
- 多屏用户务必测试不同显示器上的截图坐标。
你可以根据实际需求,选择最适合的库,用Python高效完成屏幕截图任务!
基于Python 3.8+环境测试,不同系统下字体和坐标表现可能略有差异。*