本文主要是介绍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 进一步处理,比如识别、加水印、裁剪等。
七、注意事项
八、常见用途
九、抓取指定窗口、自动识别屏幕内容、屏幕录制
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_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屏幕抓取和录制的详细代码示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!