Python opencv+win32实现非最小化窗体抓取
-
窗口句柄获取
如当前需要获取谷歌浏览器的句柄但是浏览器中有许多的子页面,此处我打开csdn为当前窗口将鼠标放置在任务栏的谷歌浏览器图标处会出现下图。
hwnd = win32gui.FindWindow(None, "CSDN - 专业开发者社区 - Google Chrome")#获取句柄号
这样我们就获取到了这个句柄。
-
获取到这个句柄后我们就可以开始截取图片了,这里需要注意的是只有在非最小化的窗口才能正常截取到图片。如果是最小化的只能截到一张黑乎乎的图片。`
def window_capture(hwnd): hwndDC = win32gui.GetWindowDC(hwnd) # 根据窗口句柄获取窗口的设备上下文DC(Divice Context) mfcDC = win32ui.CreateDCFromHandle(hwndDC) # 根据窗口的DC获取mfcDC saveDC = mfcDC.CreateCompatibleDC() # mfcDC创建可兼容的DC saveBitMap = win32ui.CreateBitmap() # 创建bigmap准备保存图片 rctA = win32gui.GetWindowRect(hwnd) w = rctA[2] - rctA[0] h = rctA[3] - rctA[1] #获取图片大小 # 截取从左上角(0,0)长宽为(w,h)的图片 saveBitMap.CreateCompatibleBitmap(mfcDC, w, h) # 为bitmap开辟空间 saveDC.SelectObject(saveBitMap) # 高度saveDC,将截图保存到saveBitmap中 saveDC.BitBlt((0, 0), (w, h), mfcDC, (0, 0), win32con.SRCCOPY) signedIntsArray = saveBitMap.GetBitmapBits(True) img = np.frombuffer(signedIntsArray, dtype="uint8") img.shape = (h, w, 4) #bit图转mat图 win32gui.DeleteObject(saveBitMap.GetHandle()) mfcDC.DeleteDC() saveDC.DeleteDC() #释放内存 return cv2.cvtColor(img, cv2.COLOR_RGBA2RGB) #转为RGB图返回
-
最后贴上完整代码
import win32gui, win32ui, win32con, win32api import cv2 import numpy as np def window_capture(hwnd): hwndDC = win32gui.GetWindowDC(hwnd) # 根据窗口句柄获取窗口的设备上下文DC(Divice Context) mfcDC = win32ui.CreateDCFromHandle(hwndDC) # 根据窗口的DC获取mfcDC saveDC = mfcDC.CreateCompatibleDC() # mfcDC创建可兼容的DC saveBitMap = win32ui.CreateBitmap() # 创建bigmap准备保存图片 rctA = win32gui.GetWindowRect(hwnd) w = rctA[2] - rctA[0] h = rctA[3] - rctA[1] #获取图片大小 # 截取从左上角(0,0)长宽为(w,h)的图片 saveBitMap.CreateCompatibleBitmap(mfcDC, w, h) # 为bitmap开辟空间 saveDC.SelectObject(saveBitMap) # 高度saveDC,将截图保存到saveBitmap中 saveDC.BitBlt((0, 0), (w, h), mfcDC, (0, 0), win32con.SRCCOPY) signedIntsArray = saveBitMap.GetBitmapBits(True) img = np.frombuffer(signedIntsArray, dtype="uint8") img.shape = (h, w, 4) #bit图转mat图 win32gui.DeleteObject(saveBitMap.GetHandle()) mfcDC.DeleteDC() saveDC.DeleteDC() #释放内存 return cv2.cvtColor(img, cv2.COLOR_RGBA2RGB) #转为RGB图返回 hwnd = win32gui.FindWindow(None, "CSDN - 专业开发者社区 - Google Chrome")#获取句柄号 cv2.imshow('Google',window_capture(hwnd)) #显示图片