python高性能截图

213 阅读1分钟
import time

import cv2
import win32api
import win32con
import win32gui
import win32ui
import numpy as np

def grab_screen_win32():
    """
    region:tuple,(left, top, right,down)
    """
    hwin = win32gui.GetDesktopWindow()
    width = 1920
    height = 1080
    left = 0
    top = 0

    hwindc = win32gui.GetWindowDC(hwin)
    srcdc = win32ui.CreateDCFromHandle(hwindc)
    memdc = srcdc.CreateCompatibleDC()
    bmp = win32ui.CreateBitmap()
    bmp.CreateCompatibleBitmap(srcdc, width, height)
    memdc.SelectObject(bmp)
    while True:
        start = int(round(time.time() * 1000))
        memdc.BitBlt((0, 0), (width, height), srcdc, (left, top), win32con.SRCCOPY)
        signedIntsArray = bmp.GetBitmapBits(True)
        img = np.frombuffer(signedIntsArray, dtype='uint8')
        # print(img.shape)
        img.shape = (height, width, 4)
        # print(img.shape)
        cv2.imshow("image", img)
        cv2.waitKey(1)
        print("耗时:", int(round(time.time() * 1000)) - start, "ms")
    srcdc.DeleteDC()
    memdc.DeleteDC()
    win32gui.ReleaseDC(hwin, hwindc)
    win32gui.DeleteObject(bmp.GetHandle())

def grab_screen_dxcam():
    import dxcam
    camera = dxcam.create(device_idx=0,output_color="BGRA")  # returns a DXCamera instance on primary monitor
    camera.start(region=(0, 0, 1920, 1080),target_fps=240,video_mode=True)  # Optional argument to capture a region
    camera.is_capturing  # True
    # ... Do Something
    while True:
        start = int(round(time.time() * 1000))
        img = camera.get_latest_frame()
        cv2.imshow("image", img)
        cv2.waitKey(1)
        print("耗时:", int(round(time.time() * 1000)) - start, "ms")
    camera.stop()
    camera.is_capturing  # False
    pass
grab_screen_dxcam()
# grab_screen_win32()

两个高性能截图库

1、使用win32截图

优点:稳定,速度也快 缺点:吃内存

2、使用dxcam库截图

优点:速度比win32还快 缺点:我的电脑识别不到n卡,理论用n卡速度还可以更快,github仓库说明可以轻松达到240fps