如何用Python案例实现屏幕截图?

wen python案例 4

如何用Python实现屏幕截图?从基础到进阶的完整案例指南

目录导读

  1. 引言:为什么选择Python进行屏幕截图?
  2. 核心库介绍与安装
  3. 基础案例:使用PIL/Pillow截图全屏
  4. 进阶案例:使用PyAutoGUI截图指定区域
  5. 高效案例:使用mss实现多屏幕截图
  6. 实战案例:定时截图与图像处理
  7. 常见问题与问答(FAQ)
  8. 总结与最佳实践

引言:为什么选择Python进行屏幕截图?

屏幕截图是自动化测试、数据监控、UI记录、甚至远程协助中的基础需求,Python凭借其丰富的第三方库生态,能轻松实现跨平台的屏幕截图,且代码量极少,从简单的全屏截图到复杂的多屏、区域截图、实时处理,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库,如果不需要图片处理,直接保存原始数据流,避免使用PILImageGrab进行连续截图。

Q4:截图后如何直接发送给API或邮件?

A:保存为二进制流,用requestssmtplib发送。

import io
from PIL import ImageGrab
img = ImageGrab.grab()
buffer = io.BytesIO()
img.save(buffer, format='PNG')
# 发送buffer.getvalue()

总结与最佳实践

通过以上案例,你已经掌握了Python实现屏幕截图的三种主流方法:

  • PIL/Pillow:全能型,适合简单截图+图像处理。
  • PyAutoGUI:适合自动化流程,可配合鼠标点击、区域选择。
  • mss:高性能首选,多屏、实时截图场景最强。

最佳实践建议

  1. 对于快速开发,优先用pyautogui;对于生产环境,用mss
  2. 截取区域时,使用相对坐标(如百分比)以提高跨屏兼容性。
  3. 多屏用户务必测试不同显示器上的截图坐标。

你可以根据实际需求,选择最适合的库,用Python高效完成屏幕截图任务!


基于Python 3.8+环境测试,不同系统下字体和坐标表现可能略有差异。*

抱歉,评论功能暂时关闭!