import time
import win32gui,win32ui,win32con
import numpy as np
import cv2
from PIL import ImageGrab, Image
import ctypes
def window_capture(hwnd,xSrc, ySrc,w,h):
hwndDC= win32gui.GetWindowDC(hwnd) #返回句柄窗口的设备环境,覆盖整个窗口,包括非客户区,标题栏,菜单,边框
mfcDC = win32ui.CreateDCFromHandle(hwndDC)#创建设备描述表
saveDC = mfcDC.CreateCompatibleDC()#创建内存设备描述表
saveBitMap = win32ui.CreateBitmap()#创建位图对象准备保存图片
rctA = win32gui.GetWindowRect(hwnd)#获取句柄窗口的大小信息
print(mfcDC)
saveBitMap.CreateCompatibleBitmap(mfcDC, w, h)#为bitmap开辟存储空间
result = ctypes.windll.user32.PrintWindow(hwnd, saveDC.GetSafeHdc(), 2)
saveDC.SelectObject(saveBitMap)#将截图保存到saveBitMap中
saveDC.BitBlt((0, 0), (w,h), mfcDC, (xSrc, ySrc), win32con.SRCCOPY)#保存bitmap到内存设备描述表(668, 406)
signedIntsArray = saveBitMap.GetBitmapBits(True)###获取位图信息
# print(saveBitMap)
img = np.frombuffer(signedIntsArray, dtype="uint8")#保存到文件
img.shape = (h, w, 4)
# cv2.cvtColor(img, cv2.COLOR_RGBA2RGB)
# 显示到屏幕
# cv2.namedWindow('img') #命名窗口
# cv2.imshow("img",img) #显示
# cv2.waitKey(0)
# cv2.destroyAllWindows()
# cv2.cvtColor(img, cv2.COLOR_BGRA2RGB)
num=0
cv2.imwrite("./baotu_img/baotu_renwulan1.jpg", img, [int(cv2.IMWRITE_JPEG_QUALITY), 100])
win32gui.DeleteObject(saveBitMap.GetHandle()) #内存释放
mfcDC.DeleteDC()
saveDC.DeleteDC()
return Image.fromarray(cv2.cvtColor(img, cv2.COLOR_RGBA2RGB))
hwnd:传入一个句柄dixSrc, 传入一个句柄内想截图位置的横(x)轴位置坐标 例如你想截一张 从句柄位置(100,200)就输入100,
ySrc, :传入一个句柄想截图位置的纵坐标(y)轴位置坐标,假如你想截取的位置在句柄上方顶点位置在(100,200)就输入200,(xsrc,ysrc)简单来说就是想截图位置上方顶点的坐标
w, 传入一个想要截图的 宽度(长度)不能大于句柄的最大宽度,也就说句柄大小为(700,620)时,(xsrc值为100时,最大能输入600,输入超过最大值会报错)
h: 传入一个想要截图的 高度 不能大于句柄的最大高度,也就说句柄大小为(700,620)时,(xsry值为200时,最大能输入420,输入超过最大值会报错)
return: 调用函数时回传一个 图片对象,
例如:
img = window_capture(8888,100, 200,50,20) 这样调用直接把8888句柄内的顶点为100,200位置开截图高度为20,长度为50的图片保存到img对象里