当前位置: 代码网 > it编程>前端脚本>Python > Python屏幕抓取和录制的详细代码示例

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

2025年09月25日 Python 我要评论
一、常用 python 屏幕抓取库pillow(pil):可以截图,但功能有限,推荐配合其他库使用。pyautogui:简单、跨平台,支持全屏截图和区域截图。mss:高性能,支持多平台,适合大规模、快

一、常用 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.getwindowswithtitle(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_title)
    if not wins:
        print('窗口未找到')
        time.sleep(1)
        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('窗口内容发生变化!')
        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屏幕抓取和录制内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com