Скриншот Lightroom частично пустой - PullRequest
0 голосов
/ 10 ноября 2019

У меня есть код, который раньше работал отлично. Одна из вещей, которую нужно сделать, - это сделать скриншот Adobe Lightroom с использованием win32gui (я делаю наложение на ложный цвет, если кому-то интересно). Недавно перестал работать, и проблема в том, что раздел изображения на снимке экрана 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")
...