如何通过Pywin32在内存中裁剪多显示器桌面截图位图
直接在内存中裁剪pywin32截取的多显示器特定区域
首先得指出你原来代码里的核心问题:你把BitBlt和SaveBitmapFile的执行顺序搞反了!你先保存了空的位图文件,再执行像素复制操作,导致保存的文件是无有效内容的全桌面尺寸空图,后续裁剪自然也不对。正确的流程应该是先把目标区域的像素直接复制到内存DC,再将内存中的位图转换成可直接处理的数组,全程不需要写入硬盘。
完整可运行解决方案
import win32gui, win32ui, win32con import numpy as np import cv2 # 第三台显示器的目标区域参数(根据你的实际布局调整) left = 3300 # 目标区域左上角的全局X坐标 top = 100 # 目标区域左上角的全局Y坐标 width = 800 # 目标区域宽度 height = 600 # 目标区域高度 # 1. 初始化桌面DC hwin = win32gui.GetDesktopWindow() hwindc = win32gui.GetWindowDC(hwin) srcdc = win32ui.CreateDCFromHandle(hwindc) # 2. 创建兼容内存DC和对应尺寸的位图 memdc = srcdc.CreateCompatibleDC() bmp = win32ui.CreateBitmap() bmp.CreateCompatibleBitmap(srcdc, width, height) memdc.SelectObject(bmp) # 3. 关键操作:直接将目标区域像素复制到内存DC # 这一步已经完成了"裁剪",只获取你需要的区域,不需要全图 memdc.BitBlt((0, 0), (width, height), srcdc, (left, top), win32con.SRCCOPY) # 4. 将PyCBitmap转换为numpy数组(纯内存操作) # GetBitmapBits(True)返回BGRA格式的字节数据 signedIntsArray = bmp.GetBitmapBits(True) img = np.frombuffer(signedIntsArray, dtype=np.uint8) img = img.reshape((height, width, 4)) # 还原为BGRA格式的图像矩阵 # 5. 转换为cv2兼容的BGR格式(如果要用cv2显示/处理) img_bgr = cv2.cvtColor(img, cv2.COLOR_BGRA2BGR) # 6. 必须释放系统资源,避免内存泄漏 memdc.DeleteDC() srcdc.DeleteDC() win32gui.ReleaseDC(hwin, hwindc) win32gui.DeleteObject(bmp.GetHandle()) # 7. 显示处理后的图像 cv2.imshow('Third Monitor Cropped Area', img_bgr) cv2.waitKey(0) # 等待按键输入后关闭窗口,没有这行cv2窗口会无响应 cv2.destroyAllWindows()
关键问题解析
- BitBlt顺序错误:你之前先执行了
bmp.SaveBitmapFile,此时位图还没有被写入任何像素数据,所以保存的是空图。正确顺序是先执行BitBlt复制目标区域像素,再处理位图数据。 - cv2窗口无响应的原因:
- 缺少
cv2.waitKey():cv2的显示窗口需要这个函数来处理事件循环,没有它窗口会卡住无响应。 - 格式不兼容:pywin32的位图是BGRA格式,而cv2默认期望BGR格式,需要用
cv2.COLOR_BGRA2BGR转换,否则显示颜色会异常。
- 缺少
- PyCBitmap转numpy的正确方式:
GetBitmapBits(True)返回的是连续的字节数组,用np.frombuffer转换后,需要reshape成(height, width, 4)的三维矩阵,对应BGRA四个通道。 - 资源释放:必须手动删除创建的DC和位图对象,否则会造成系统GDI资源泄漏。
可选:用PIL处理图像
如果不需要用cv2,也可以直接用PIL转换并处理:
from PIL import Image img_pil = Image.frombuffer('RGBA', (width, height), signedIntsArray, 'raw', 'BGRA', 0, 1) img_pil.show() # 直接显示 # 也可以保存为其他格式 # img_pil.save('cropped_area.png')
内容的提问来源于stack exchange,提问作者Q.H.
相关产品推荐
相关产品推荐

