gpt4 book ai didi

python - 将 WinAPI 屏幕截图转换为 OpenCV 兼容形式

转载 作者:太空宇宙 更新时间:2023-11-03 21:34:23 34 4
gpt4 key购买 nike

所以我最初问了一个问题here与 PIL 相比,使用 win api 进行更快的屏幕捕获。我能够通过 BitBlt 成功捕获屏幕。

现在我不确定如何将位图转换为可以与 OpenCV 一起使用的形式。 OpenCV 不支持位图,当我 print(im) 它是一个 ~14k 长的一维数组。 OpenCV 对 1D 无能为力,我曾尝试用 NUMPY reshape 它但没有成功。

def take_screenshot1(hwnd):
wDC = win32gui.GetWindowDC(hwnd)
dcObj=win32ui.CreateDCFromHandle(wDC)
cDC=dcObj.CreateCompatibleDC()
dataBitMap = win32ui.CreateBitmap()
dataBitMap.CreateCompatibleBitmap(dcObj, 765, 503)
cDC.SelectObject(dataBitMap)
cDC.BitBlt((0, 0), (765, 503), dcObj, (0, 0), win32con.SRCCOPY)

im = dataBitMap.GetBitmapBits(False)
#img = np.array(im)
#cv2.cvtColor(img, cv2.COLOR_RGB2BGR)

dcObj.DeleteDC()
cDC.DeleteDC()
win32gui.ReleaseDC(hwnd, wDC)
win32gui.DeleteObject(dataBitMap.GetHandle())

编辑:这是工作代码:

def take_screenshot1(hwnd):
wDC = win32gui.GetWindowDC(hwnd)
dcObj=win32ui.CreateDCFromHandle(wDC)
cDC=dcObj.CreateCompatibleDC()
dataBitMap = win32ui.CreateBitmap()
dataBitMap.CreateCompatibleBitmap(dcObj, 765, 503)
cDC.SelectObject(dataBitMap)
cDC.BitBlt((0, 0), (765, 503), dcObj, (0, 0), win32con.SRCCOPY)

im = dataBitMap.GetBitmapBits(False)

img = np.array(im).astype(dtype="uint8")

img.shape = (503,765,4)

cv2.cvtColor(img, cv2.COLOR_RGB2BGR)

dcObj.DeleteDC()
cDC.DeleteDC()
win32gui.ReleaseDC(hwnd, wDC)
win32gui.DeleteObject(dataBitMap.GetHandle())

最佳答案

GetBitmapBits()在它的 Python 化身中返回一个有符号整数数组而不是无符号字节。您应该先将其转换为无符号字节,然后按照@DanMašek 所说的进行操作。

关于python - 将 WinAPI 屏幕截图转换为 OpenCV 兼容形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40306865/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com