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

Written by

in

文章目录
  • Pillow(PIL):可以截图,但功能有限,推荐配合其他库使用。 pyautogui:简单、跨平台,支持全屏截图和区域截图。 mss:高性能,支持多平台,适合大规模、快速截图。 opencv-python:可以处理截图后的图像,但本身不直接抓屏。
  • 安装: 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’)
  • 安装: 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”)
  • 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 文字识别 游戏/教学录屏
  • 到此这篇关于Python屏幕抓取和录制的文章就介绍到这了,更多相关Python屏幕抓取和录制内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: 对Python获取屏幕截图的4种方法详解 Python实现屏幕截图的两种方式 Python编写屏幕截图程序方法 用Python实现屏幕截图详解 Python实现屏幕截图的代码及函数详解 使用Python实现屏幕截图的两种方法
  • 目录
    • 一、常用 Python 屏幕抓取库
    • 二、pyautogui 截屏示例
    • 三、mss 高性能截图
    • 四、Pillow 截屏(仅部分平台支持)
    • 五、屏幕录制(视频)
    • 六、抓取后处理
    • 七、注意事项
    • 八、常见用途
    • 九、抓取指定窗口、自动识别屏幕内容、屏幕录制
      • 1. 抓取指定窗口
        • Windows 平台推荐:pygetwindow + pyautogui 或 mss
        • 用 mss 截取窗口区域
        • macOS/Linux
      • 2. 自动识别屏幕内容(OCR)
        • Tesseract OCR 示例
        • 结合窗口截图和OCR
      • 3. 屏幕录制
        • 方法一:用 OpenCV + pyautogui 录制全屏或指定区域
        • 方法二:用 mss 录制屏幕(高效)
      • 总结
      • 十、自动化、定时抓取、窗口变化检测
        • 1. 自动化与定时抓取
          • 示例:每隔5秒抓取窗口截图
        • 2. 窗口变化检测
          • 2.1 检测窗口位置和尺寸变化
          • 2.2 检测窗口内容变化(像素级)
        • 3. 自动化综合示例(定时+变化检测+OCR)
          • 4. 线程/异步:不阻塞主线程
            • 5. 进阶建议
            • 总结 

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

              安装:

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

              安装:

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

              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 文字识别
              • 游戏/教学录屏

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

              步骤:

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

              示例代码:

              安装依赖:

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

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

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

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

              安装:

              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)

              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)

              安装:

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

              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

              可以用 schedulethreadingtime 等库实现定时任务,比如每隔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秒抓取一次

              窗口变化主要有两类:

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

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

              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)

              可以对比两次截图的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

              综合:每隔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)

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

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

              到此这篇关于Python屏幕抓取和录制的文章就介绍到这了,更多相关Python屏幕抓取和录制内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

              您可能感兴趣的文章:

              • 对Python获取屏幕截图的4种方法详解
              • Python实现屏幕截图的两种方式
              • Python编写屏幕截图程序方法
              • 用Python实现屏幕截图详解
              • Python实现屏幕截图的代码及函数详解
              • 使用Python实现屏幕截图的两种方法

              站内搜索