Python屏幕抓取和录制的详细代码示例

2025-09-25 12:50

本文主要是介绍Python屏幕抓取和录制的详细代码示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Python屏幕抓取和录制的详细代码示例》随着现代计算机性能的提高和网络速度的加快,越来越多的用户需要对他们的屏幕进行录制,:本文主要介绍Python屏幕抓取和录制的相关资料,需要的朋友可以参考...

一、常用 Python 屏幕抓取库

  • Pillow(PIL):可以截图,但功能有限,推荐配合其他库使用。
  • pyautogui:简单、跨平台,支持全屏截图和区域截图。
  • mss:高性能,支持多平台,适合大规模、快速截图。
  • opencv-python:可以处理截图后的图像,但本身不直接抓屏。

二、pyautogui 截屏示例

安装

pip install pyautogui

全屏截图并保存:

import pyautogui

screenshot = pyautogui.screenshot()
screenshot.save('screenshot.png')

截取指定区域(左上角坐标和宽高):

import pyautogui

region = (100, 100, 300, 200)  # x, y, width, height
screenshot = pyautogui.screenshot(region=region)
screenshot.save('region.png')

三、mss 高性能截图

安装:

pip install mss

全屏截图:

import mss

with mss.mss() as sct:
    sct.shot(output='mss_full.png')

指定区域截图:

import mss

with mss.mss() as sct:
    monitor = {"top": 100, "left": 100, "width": 300, "height": 200}
    sct_img = sct.grab(monitor)
    mss.tools.to_png(sct_img.rgb, sct_img.size, output="mss_region.png")

四、Pillow 截屏(仅部分平台支持)

from PIL import ImageGrab

im = ImageGrab.grab()
im.save('pillow_screen.png')

五、屏幕录制(视频)

屏幕录制需要更复杂的工具,比如 opencv-python + pyautogui 或 mss,也可以用第三方软件或 ffmpeg。

简单示例(录制屏幕为视频,需安装 opencv-python):

import cv2
import numpy as np
import pyautogui

screen_size = pyautogui.size()
fourcc = cv2.VideoWriter_fourcc(*"XVID")
out = cv2.VideoWriter("output.avi", fourcc, 20.0, screen_size)

for i in range(100):  # 录制100帧
    img = pyautogui.screenshot()
    frame = np.array(img)
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    out.write(frame)

out.release()
cv2.destroyAllWindows()

六、抓取后处理

抓取到的图片可以用 Pillow 或 OpenCV 进一步处理,比如识别、加水印、裁剪等。

七、注意事项

  • 部分库在 macOS 需要额外设置权限(系统设置 → 安全与隐私 → 屏幕录制)。
  • Linux 下部分库依赖 X11。
  • 截屏速度和性能,推荐用 mss。

八、常见用途

  • 自动化测试
  • 远程监控
  • OCR 文字识别
  • 游戏/教学录屏

九、抓取指定窗口、自动识别屏幕内容、屏幕录制

1. 抓取指定窗口

抓取指定窗口通常需要获取窗口句柄,然后截图该窗口区域。不同操作系统方式略有不同,Windows支持最好。

Windows 平台推荐:pygetwindow + pyautogui 或 mss

步骤:

  • 获取窗口坐标
  • 用截图工具抓取该区域

示例代码:

安装依赖:

pip install pygetwindow pyautogui ms
import pygetwindow as gw
import pyautogui

# 获取所有窗口标题
print(gw.getAllTitles())

# 获取某个窗口(如“记事本”)
win = gw.getWindowsWithTitle('记事本')[0]
print(win.left, win.top, win.width, win.height)

# 截取窗口区域
region = (win.left, win.top, win.width, win.height)
img = pyautogui.screenshot(region=region)
img.save('window.png')

用 mss 截取窗口区域

import mss

with mss.mss() as sct:
    monitor = {"top": win.top, "left": win.left, "width": win.width, "height": win.height}
    sct_img = sct.grab(monitor)
    mss.tools.to_png(sct_img.rgb, sct_img.size, output="window_mss.png")

macOS/Linux

获取窗口位置需要用到pyobjcpython-xlib等,较为复杂,可参考 pygetwindow 文档。

2. 自动识别屏幕内容(OCR)

可以用百度OCR、腾讯OCR、Google Tesseract OCR等,最常用的是 Tesseract。

Tesseract OCR 示例

安装:

pip install pytesseract pillow

并安装 Tesseract 可执行文件。

代码:

from PIL import Image
import pytesseract

img = Image.open('window.png')
text = pytesseract.image_to_string(img, lang='chi_sim')  # 中文用 lang='chi_sim'
print(text)

结合窗口截图和OCR

import pyautogui
from PIL import Image
import pytesseract
import pygetwindow as gw

win = gw.getWindowsWithTitle('记事本')[0]
region = (win.left, win.top, win.width, win.height)
img = pyautogui.screenshot(region=region)
img.save('window.png')

text = pytesseract.image_to_string(img)
print(text)

3. 屏幕录制

方法一:用 OpenCV + pyautogui 录制全屏或指定区域

安装:

pip install opencv-python pyautogui numpy

录制指定区域(如窗口):

import cv2
import numpy as np
import pygetwindow as gw
import pyautogui

win = gw.getWindowsWithTitle('记事本')[0]
region = (win.left, win.top, win.width, win.height)
width, height = win.width, win.height

fourcc = cv2.VideoWriter_fourcc(*"XVID")
out = cv2.VideoWriter("window_record.avi", fourcc, 10.0, (width, height))

for i in range(200):  # 录制200帧
    img = pyautogui.screenshot(region=region)
    frame = np.array(img)
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
    out.write(frame)

out.release()
cv2.destroyAllWindows()

方法二:用 mss 录制屏幕(高效)

import mss
import cv2
import numpy as np
import pygetwindow as gw

win = gw.getWindowsWithTitle('记事本')[0]
monitor = {"top": win.top, "left": win.left, "width": win.width, "height": win.height}
width, height = win.width, win.height

fourcc = cv2.VideoWriter_fourcc(*"XVID")
out = cv2.VideoWriter("window_mss_record.avi", fourcc, 10.0, (width, height))

with mss.mss() as sct:
    for i in range(200):
        sct_img = sct.grab(monitor)
        frame = np.array(sct_img)
        frame = cv2.cvtColor(frame, cv2.COLOR_BGRA2BGR)
        out.write(frame)

out.release()
cv2.destroyAllWindows()

总结

  • 抓取指定窗口:pygetwindow + pyautogui/mss
  • 自动识别内容:pytesseract(OCR)
  • 屏幕录制:opencv/mss

十、自动化、定时抓取、窗口变化检测

1. 自动化与定时抓取

可以用 schedulethreadingtime 等库实现定时任务,比如每隔5秒抓取一次指定窗口内容。

示例:每隔5秒抓取窗口截图

import time
import pygetwindow as gw
import pyautogui
import datetime

WINDOW_TITLE = '记事本'  # 替换为你的目标窗口标题

def grab_window():
    wins = gw.getW编程indowsWithTitle(WINDOW_TITLE)
    if not wins:
        print(f'窗口"{WINDOW_TITLE}"未找到')
        return
    win = wins[0]
    region = (win.left, win.top, win.width, win.height)
    img = pyautogui.screenshot(region=region)
    timestamp = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
    filename = f'{WINDOW_TITLE}_{timestamp}.png'
    img.save(filename)
    print(f'保存截图:{filename}')

if __name__ == '__main__':
    while True:
        grab_window()
        time.sleep(5)  # 每5秒抓取一次

2. 窗口变化检测

窗口变化主要有两类:

  • 窗口内容变化:比如内容刷新、弹窗等
  • 窗口位置/尺寸变化:比如用户拖动/缩放窗口

2.1 检测窗口位置和尺寸变化

可以每次抓取前记录窗口的坐标和尺寸,和上一次对比:

import pygetwindow as gw
import time

WINDOW_TITLE = '记事本'

last_rect = None

while True:
    wins = gw.getWindowsWithTitle(WINDOW_TITLE)
    if not wins:
        print('窗口未找到')
        time.sleep(1)
        continue
    win = wins[0]
    rect = (win.left, win.top, win.width, win.height)
    if last_rect != rect:
        print(f'窗口变化:{rect}')
        last_rect = rect
    time.sleep(1)

2.2 检测窗口内容变化(像素级)

可以对比两次截图的hash或像素差异,常用方法有:

  • Pillow ImageChops.difference
  • 感知哈希(pHash)

示例:用感知哈希检测内容变化

from PIL import Image
import imagehash
import pygetwindow as gw
import pyautogui
import time

WINDOW_TITLE = '记事本'
last_hash = None

while True:
    wins = gw.getWindowsWithTitle(WINDOW_TIChina编程TLE)
    if not wins:
        print('窗口未找到')
        time.sleep(1)
        continue
    win = wins[0]
    region = (win.left, win.top, win.width, win.height)
php    img = pyautogui.screenshot(region=region)
    hashval = imagehash.phash(img)
    if last_hash is not None and hashval != last_hash:
        print('窗口内容发生变化!')
        img.save(f'changed_{time.time()}.png')
    last_hash = hashval
    time.sleep(2)

需要安装 imagehash 和 pillow
pip install imagehash pillow

3. 自动化综合示例(定时+变化检测+OCR)

综合:每隔N秒抓取窗口,若内容有变化则自动OCR识别并保存文本。

import pygetwindow as gw
import pyautogui
import imagehash
from PIL import Image
import pytesseract
import time
import datetime

WINDOW_TITLE = '记事本'
last_hash = None

while True:
    wins = gw.getWindowsWithTitle(WINDOW_TITLE)
    if not wins:
        print('窗口未找到')
        time.sleep(2)
        continue
    win = wins[0]
    region = (win.left, win.top, win.width, win.height)
    img = pyautogui.screenshot(region=region)
    hashval = imagehash.phash(img)
    if last_hash is not None and hashval != last_hash:
        print('窗口内容发生变化,进行OCR识别...')
        text = pytesseract.image_to_string(img, lang='chi_sim')
        timestamp = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
        img.save(f'changed_{timestamp}.png')
        with open(f'changed_{timestamp}.txt', 'w', encoding='utf-8') as f:
            f.write(text)
    last_hash = hashval
    time.sleep(5)

4. 线程/异步:不阻塞主线程

如果你还想让程序同时响应用户操作,可以用 threading 或 asyncio 实现非阻塞定时抓取。

5. 进阶建议

  • 多窗口监控:遍历多个窗口标题。
  • 报警通知:内容变化自动发邮件/消息。
  • 日志记录:记录变化事件和时间。
  • 异常处理:防止窗口消失导致程序崩溃。

总结 

到此这篇关于Python屏幕抓取和录制的文章就介绍到这了,更多相关Python屏幕抓取和录制内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于Python屏幕抓取和录制的详细代码示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1156024

相关文章

利用Python把路径转为绝对路径的方法

《利用Python把路径转为绝对路径的方法》在Python中,如果你有一个相对路径并且想将其转换为绝对路径,你可以使用Path对象的resolve()方法,Path是Python标准库pathlib中... 目录1. os.path.abspath 是什么?怎么用?基本用法2. os.path.abspat

Python绘制TSP、VRP问题求解结果图全过程

《Python绘制TSP、VRP问题求解结果图全过程》本文介绍用Python绘制TSP和VRP问题的静态与动态结果图,静态图展示路径,动态图通过matplotlib.animation模块实现动画效果... 目录一、静态图二、动态图总结【代码】python绘制TSP、VRP问题求解结果图(包含静态图与动态图

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

Java中的Schema校验技术与实践示例详解

《Java中的Schema校验技术与实践示例详解》本主题详细介绍了在Java环境下进行XMLSchema和JSONSchema校验的方法,包括使用JAXP、JAXB以及专门的JSON校验库等技术,本文... 目录1. XML和jsON的Schema校验概念1.1 XML和JSON校验的必要性1.2 Sche

使用MapStruct实现Java对象映射的示例代码

《使用MapStruct实现Java对象映射的示例代码》本文主要介绍了使用MapStruct实现Java对象映射的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、什么是 MapStruct?二、实战演练:三步集成 MapStruct第一步:添加 Mave

macOS彻底卸载Python的超完整指南(推荐!)

《macOS彻底卸载Python的超完整指南(推荐!)》随着python解释器的不断更新升级和项目开发需要,有时候会需要升级或者降级系统中的python的版本,系统中留存的Pytho版本如果没有卸载干... 目录MACOS 彻底卸载 python 的完整指南重要警告卸载前检查卸载方法(按安装方式)1. 卸载

Java抽象类Abstract Class示例代码详解

《Java抽象类AbstractClass示例代码详解》Java中的抽象类(AbstractClass)是面向对象编程中的重要概念,它通过abstract关键字声明,用于定义一组相关类的公共行为和属... 目录一、抽象类的定义1. 语法格式2. 核心特征二、抽象类的核心用途1. 定义公共接口2. 提供默认实

PyQt6 键盘事件处理的实现及实例代码

《PyQt6键盘事件处理的实现及实例代码》本文主要介绍了PyQt6键盘事件处理的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起... 目录一、键盘事件处理详解1、核心事件处理器2、事件对象 QKeyEvent3、修饰键处理(1)、修饰键类

Java轻松实现PDF转换为PDF/A的示例代码

《Java轻松实现PDF转换为PDF/A的示例代码》本文将深入探讨Java环境下,如何利用专业工具将PDF转换为PDF/A格式,为数字文档的永续保存提供可靠方案,文中的示例代码讲解详细,感兴趣的小伙伴... 目录为什么需要将PDF转换为PDF/A使用Spire.PDF for Java进行转换前的准备通过

Python异常处理之避免try-except滥用的3个核心原则

《Python异常处理之避免try-except滥用的3个核心原则》在Python开发中,异常处理是保证程序健壮性的关键机制,本文结合真实案例与Python核心机制,提炼出避免异常滥用的三大原则,有需... 目录一、精准打击:只捕获可预见的异常类型1.1 通用异常捕获的陷阱1.2 精准捕获的实践方案1.3