Last active
September 28, 2021 02:27
-
-
Save Mufanc/daba06a4d6a833ba854f956238884166 to your computer and use it in GitHub Desktop.
[获取屏幕截图(有边框)] Python 调用 WinAPI 获取屏幕截图 #Python #OpenCV
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import cv2 | |
import numpy as np | |
import win32con | |
import win32gui | |
import win32ui | |
class Screencap(object): | |
def __init__(self, class_name, window_name): | |
self.hwnd = win32gui.FindWindow(class_name, window_name) | |
assert self.hwnd | |
self.hwnd_dc = win32gui.GetWindowDC(self.hwnd) | |
self.mfc_dc = win32ui.CreateDCFromHandle(self.hwnd_dc) | |
self.save_dc = self.mfc_dc.CreateCompatibleDC() | |
def get_window_rect(self): # dpi 缩放级别会影响 win32gui.GetWindowRect,故换用此实现 | |
rect = wintypes.RECT() | |
DWMWA_EXTENDED_FRAME_BOUNDS = 9 | |
ctypes.windll.dwmapi.DwmGetWindowAttribute( | |
wintypes.HWND(self.hwnd), | |
ctypes.wintypes.DWORD(DWMWA_EXTENDED_FRAME_BOUNDS), | |
ctypes.byref(rect), | |
ctypes.sizeof(rect) | |
) | |
return rect.left, rect.top, rect.right, rect.bottom | |
def read(self): | |
bitmap = win32ui.CreateBitmap() | |
left, top, right, bottom = self.get_window_rect() | |
width, height = right - left, bottom - top | |
bitmap.CreateCompatibleBitmap(self.mfc_dc, width, height) | |
self.save_dc.SelectObject(bitmap) | |
self.save_dc.BitBlt((0, 0), (width, height), self.mfc_dc, (0, 0), win32con.SRCCOPY) | |
# bitmap.SaveBitmapFile(save_dc, 'Test.bmp') | |
ints_array = bitmap.GetBitmapBits(True) | |
win32gui.DeleteObject(bitmap.GetHandle()) | |
img = np.frombuffer(ints_array, dtype='uint8') | |
img.shape = (height, width, 4) | |
return cv2.cvtColor(img, cv2.COLOR_BGRA2BGR) | |
def __del__(self): | |
self.save_dc.DeleteDC() | |
self.mfc_dc.DeleteDC() | |
win32gui.ReleaseDC(self.hwnd, self.hwnd_dc) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment