求推荐Python库:获取应用窗口帧并改写窗口画面
可行技术方案实现思路
一、窗口帧抓取:替代PyAutoGUI的高效方案
PyAutoGUI截图效率过低,不适合实时场景,推荐两种高性能方案:
- Windows GDI/DirectX绑定库:用
pywin32直接调用系统GDI函数,从窗口设备上下文(DC)抓取帧,速度远快于PyAutoGUI。示例代码:import win32gui import win32ui import win32con import numpy as np def capture_window(hwnd): left, top, right, bot = win32gui.GetWindowRect(hwnd) w, h = right - left, bot - top hwndDC = win32gui.GetWindowDC(hwnd) mfcDC = win32ui.CreateDCFromHandle(hwndDC) saveDC = mfcDC.CreateCompatibleDC() saveBitMap = win32ui.CreateBitmap() saveBitMap.CreateCompatibleBitmap(mfcDC, w, h) saveDC.SelectObject(saveBitMap) saveDC.BitBlt((0,0), (w,h), mfcDC, (0,0), win32con.SRCCOPY) # 转换为numpy数组供后续处理 signedIntsArray = saveBitMap.GetBitmapBits(True) img = np.frombuffer(signedIntsArray, dtype='uint8') img.shape = (h, w, 4) # 清理资源 win32gui.DeleteObject(saveBitMap.GetHandle()) saveDC.DeleteDC() mfcDC.DeleteDC() win32gui.ReleaseDC(hwnd, hwndDC) return img - FFmpeg硬件加速抓取:用
ffmpeg-python调用FFmpeg的gdigrab或dxva2设备,直接捕获窗口流,输出RGB帧供超分处理,适合高帧率场景。
二、实时超分算法集成
- Real-ESRGAN:官方提供Python实现,GPU上单帧处理速度可达实时(1080p转4K约30fps+),可通过
realesrgan包快速集成:from realesrgan import RealESRGANer import cv2 upscaler = RealESRGANer( scale=2, model_path='RealESRGAN_x2plus.pth', tile=0, tile_pad=10, pre_pad=0, half=True # 启用半精度加速 ) def upscale_frame(frame): # 转换为OpenCV默认的BGR格式 frame_bgr = cv2.cvtColor(frame, cv2.COLOR_RGBA2BGR) output, _ = upscaler.enhance(frame_bgr, outscale=2) # 转回RGBA格式供显示 output_rgba = cv2.cvtColor(output, cv2.COLOR_BGR2RGBA) return output_rgba - FSR/DLSS:可通过
ctypes调用AMD/NVIDIA提供的动态链接库(如AMD FSR DLL、NVIDIA DLSS SDK)实现硬件加速超分,速度远快于软件版本,适合实时场景。
三、超分画面的显示(替代“改写原应用窗口”)
直接修改原应用的渲染画面不可行(应用渲染上下文独立),通用方案是创建无边框顶层覆盖窗口,实时渲染超分后的画面:
- 用PyQt/PySide实现示例:
from PyQt5.QtWidgets import QMainWindow, QApplication, QLabel from PyQt5.QtGui import QImage, QPixmap from PyQt5.QtCore import Qt, QTimer import sys import win32gui class OverlayWindow(QMainWindow): def __init__(self, target_hwnd): super().__init__() self.target_hwnd = target_hwnd # 设置无边框、置顶、透明背景 self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.Tool) self.setAttribute(Qt.WA_TranslucentBackground) # 对齐目标窗口位置和超分后的尺寸 left, top, right, bot = win32gui.GetWindowRect(target_hwnd) self.setGeometry(left, top, (right-left)*2, (bot-top)*2) # 定时器更新画面(约60fps) self.timer = QTimer(self) self.timer.timeout.connect(self.update_frame) self.timer.start(16) def update_frame(self): # 1. 抓取原窗口帧 frame = capture_window(self.target_hwnd) # 2. 超分处理 upscaled_frame = upscale_frame(frame) # 3. 渲染到窗口 h, w, ch = upscaled_frame.shape q_img = QImage(upscaled_frame.data, w, h, ch*w, QImage.Format_RGBA8888) self.setCentralWidget(QLabel()) self.centralWidget().setPixmap(QPixmap.fromImage(q_img)) if __name__ == "__main__": app = QApplication(sys.argv) # 替换为目标游戏窗口的标题 target_hwnd = win32gui.FindWindow(None, "Target Window Title") overlay = OverlayWindow(target_hwnd) overlay.show() sys.exit(app.exec_()) - 补充:需监听原窗口的移动、大小变化事件,实时同步覆盖窗口的位置和尺寸。
四、性能优化要点
- 全流程GPU加速:硬件解码抓帧、CUDA/ROCm超分、GPU窗口渲染。
- 减少数据拷贝:尽量在显存内处理帧数据,避免CPU与GPU间频繁传输。
- 多线程拆分:将抓帧、超分、渲染拆分为独立线程,避免单线程阻塞导致帧率下降。
内容的提问来源于stack exchange,提问作者MysteRys337
相关产品推荐
相关产品推荐

