Skip to content

Instantly share code, notes, and snippets.

@Mufanc
Last active September 28, 2021 02:27
Show Gist options
  • Save Mufanc/daba06a4d6a833ba854f956238884166 to your computer and use it in GitHub Desktop.
Save Mufanc/daba06a4d6a833ba854f956238884166 to your computer and use it in GitHub Desktop.
[获取屏幕截图(有边框)] Python 调用 WinAPI 获取屏幕截图 #Python #OpenCV
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