将 win32ui DataBitmap 转换为 python 中的数组

Convert win32ui DataBitmap to array in python

我想截屏而不是将其转换为数组,而不是将文件作为图像保存在路径中并从该路径再次加载以进行转换:

我想要的是直接将数据转换成数组:

        w = 1920
        h = 1080
        bmpfilenamename = r"path"
        hwnd = win32gui.FindWindow(None, "my_window")
        wDC = win32gui.GetWindowDC(hwnd)
        dcObj=win32ui.CreateDCFromHandle(wDC)
        cDC=dcObj.CreateCompatibleDC()
        dataBitMap = win32ui.CreateBitmap()
        dataBitMap.CreateCompatibleBitmap(dcObj, w, h)
        cDC.SelectObject(dataBitMap)
        cDC.BitBlt((0, 0),(w, h) , dcObj, (0, 0), win32con.SRCCOPY)
        dataBitMap.SaveBitmapFile(cDC, bmpfilenamename) #i want to ignor this phase and directly convert the data to array
        My_array = np.array(#myimg , dtype='float')
        print(array)
        print(array.shape)

我的最终目标是为神经网络预测模型提供快速的屏幕截图流

您可以使用 PIL 将 dataBitMap 转换为 PIL Image 对象,如 here 所示。
使用 array = np.asarray(im)im 转换为 NumPy 数组。

像素格式应该是 BGRA。

这是一个代码示例:

import win32gui
import win32ui
import win32con
import numpy as np
from PIL import Image
import cv2  # Used for showing the NumPy array as image

w = 1920
h = 1080
hwnd = win32gui.FindWindow(None, "my_window")
wDC = win32gui.GetWindowDC(hwnd)
dcObj = win32ui.CreateDCFromHandle(wDC)
cDC = dcObj.CreateCompatibleDC()
dataBitMap = win32ui.CreateBitmap()
dataBitMap.CreateCompatibleBitmap(dcObj, w, h)
cDC.SelectObject(dataBitMap)
cDC.BitBlt((0, 0), (w, h), dcObj, (0, 0), win32con.SRCCOPY)

# 
bmpinfo = dataBitMap.GetInfo()
bmpstr = dataBitMap.GetBitmapBits(True)
im = Image.frombuffer('RGBA', (bmpinfo['bmWidth'], bmpinfo['bmHeight']), bmpstr, 'raw', 'RGBA', 0, 1)

array = np.asarray(im) # Convet to NumPy array

# Show image for testing
cv2.imshow('array', array)
cv2.waitKey()
cv2.destroyAllWindows()