我有一个代码,过去可以正常工作。它需要做的一件事是使用win32gui获取Adobe Lightroom的屏幕截图(如果有人感兴趣,我会制作错误的颜色覆盖图)。 最近停止工作,问题是lightroom屏幕截图中的图像部分现在为空白。 我必须说,我不知道pywin32,位图,句柄,屏幕截图,窗口以及所有这些如何工作,所以请保持柔和。我使用了在其他地方获得的部分代码,并通过反复试验找出了可运行的代码。如果您发现有什么时髦的事要告诉我,我会解决的。 我不太经常使用该代码,因此我不知道是什么导致了这种行为,但是我很确定这是一个lightroom更新。
下面是显示问题的代码。如果有人同时安装了python和adobe lightroom,则可以尝试一下。
有人可以解决吗?有可能: 1)修复win32gui以获取屏幕截图 2)建议使用其他模块,以进行正确的快照。
import win32gui
import win32ui
import win32con
import cv2
from time import sleep
import numpy as np
def _get_windows_bytitle(title_text, exact = False):
def _window_callback(hwnd, all_windows):
all_windows.append((hwnd, win32gui.GetWindowText(hwnd)))
windows = []
win32gui.EnumWindows(_window_callback, windows)
if exact:
return [hwnd for hwnd, title in windows if title_text == title]
else:
return [hwnd for hwnd, title in windows if title_text in title]
def take_screenshot1(hwnd):
wDC = win32gui.GetWindowDC(hwnd)
dcObj=win32ui.CreateDCFromHandle(wDC)
cDC=dcObj.CreateCompatibleDC()
dataBitMap = win32ui.CreateBitmap()
dataBitMap.CreateCompatibleBitmap(dcObj, 1900, 1079)
cDC.SelectObject(dataBitMap)
cDC.BitBlt((0, 0), (1900, 1079), dcObj, (0, 0), win32con.SRCCOPY)
im = dataBitMap.GetBitmapBits(False)
img = np.array(im).astype(dtype="uint8")
img.shape = (1079,1900,4)
cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
dcObj.DeleteDC()
cDC.DeleteDC()
win32gui.ReleaseDC(hwnd, wDC)
win32gui.DeleteObject(dataBitMap.GetHandle())
return img
img = take_screenshot1(_get_windows_bytitle(title_text = 'Lightroom', exact = False)[0])
cv2.imshow('Test',img)
cv2.waitKey()
print ("Done")