目录
- 一、常用 python 屏幕抓取库
- 二、pyautogui 截屏示例
- 三、mss 高性能截图
- 四、Pillow 截屏(仅部分平http://www.devze.com台支持)
- 五、屏幕录制(视频)
- 六、抓取后处理
- 七、注意事项
- 八、常见用途
- 九、抓取指定窗口、自动识别屏幕内容、屏幕录制
- 1. 抓取指定窗口
- Windows 平台推荐:pygetwindow + pyautog编程客栈ui 或 mss
- 用 mss 截取窗口区域
- MACOS/linux
- 2. 自动识别屏幕内容(OCR)
- Tesseract OCR 示例
- 结合窗口截图和OCR
- 3. 屏幕录制
- 方法一:用 OpenCV + pyautogui 录制全屏或指定区域
- 方法二:用 mss 录制屏幕(高效)
- 总结
- 十、自动化、定时抓取、窗口变化检测
- 1. 自动化与定时抓取
- 示例:每隔5秒抓取窗口截图
- 2. 窗口变化检测
- 2.1 检测窗口位置和尺寸变化
- 2.2 检测窗口内容变化(像素级)
- 3. 自动化综合示例(定时+变化检测+OCR)
- 4. 线程/异步:不阻塞主线程
- 5. 进阶建议
- 总结
一、常用 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
获取窗口位置需要用到pyobjc、python-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. 自动化与定时抓取
可以用 schedule、threading、time 等库实现定时任务,比如每隔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_TI编程客栈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屏幕抓取和录制内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
加载中,请稍侯......
精彩评论