开发者

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

开发者 https://www.devze.com 2025-09-26 09:34 出处:网络 作者: 燎原人生
目录一、常用 python 屏幕抓取库二、pyautogui 截屏示例三、mss 高性能截图四、Pillow 截屏(仅部分平http://www.devze.com台支持)五、屏幕录制(视频)六、抓取后处理七、注意事项八、常见用途九、抓取指定窗口、自
目录
  • 一、常用 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

            获取窗口位置需要用到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.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)!

            0

            精彩评论

            暂无评论...
            验证码 换一张
            取 消

            关注公众号