python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python屏幕抓取和录制

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

作者:燎原人生

随着现代计算机性能的提高和网络速度的加快,越来越多的用户需要对他们的屏幕进行录制,这篇文章主要介绍了Python屏幕抓取和录制的相关资料,需要的朋友可以参考下

一、常用 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 进一步处理,比如识别、加水印、裁剪等。

七、注意事项

八、常见用途

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

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()

总结

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

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或像素差异,常用方法有:

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

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屏幕抓取和录制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文