Получение черно-белого изображения при повторном вызове функции скриншота mss - PullRequest
0 голосов
/ 07 января 2019

Я использовал модуль mss (https://pypi.org/project/mss/) для создания снимков экрана. При повторном вызове функции я получаю черно-белое изображение. Самое странное, что иногда это удается.

Я пытался дать время вроде sleep(1) между вызовами, но это не помогло.

import mss
import mss.tools
from PIL import Image
import win32gui

def screen_part(top, left, width, height):
    '''
    Returns a PIL image of the part of the screen
    '''
    with mss.mss() as sct:
        # The screen part to capture
        monitor = {"top": top, "left": left, "width": width, "height": height}
        output = "sct-{top}x{left}_{width}x{height}.png".format(**monitor)

        # Grab the data
        sct_img = sct.grab(monitor)

        # Convert to PIL Image
        img = Image.frombytes("RGB", sct_img.size, sct_img.bgra, "raw", "BGRX")

        return img

def window_coordinates(win_name):
    '''
    Returns rect for the window --> tuple

    '''
    x = y = w = h = None
    def callback(hwnd, extra):
        if win32gui.GetWindowText(hwnd) == win_name:
            nonlocal x, y, w, h
            rect = win32gui.GetWindowRect(hwnd)
            x_ = rect[0]
            y_ = rect[1]
            w_ = rect[2] - x
            h_ = rect[3] - y

    win32gui.EnumWindows(callback, None)
    return x, y, w, h

def capture_left_figure(win_name):
    '''
    x_karty / (x_table + w_table) * (x_t + w_t)

    '''

   x, y, w, h = window_coordinates(win_name)

    left = round(439 / 1084 * w) + x
    top = round(1743 / 1963  * h) + y
    w = round(50 / 1084 * w)
    h = round(39 / 1963 * h)

    print(left, top, w, h)

    img = screen_part(top, left, w, h)
    return img

img_1 = f.capture_left_figure('window_name1')
img_1.show()

img_2 = f.capture_left_figure('window_name2')
img_2.show()

Первое изображение всегда хорошо. Второе изображение подавляет большую часть времени, иногда (особенно когда окно большое), оно удивительно хорошо работает. Я понятия не имею, в чем может быть причина. Я буду благодарен за любой совет.

РЕДАКТИРОВАТЬ: я обмениваю функцию скриншота mss на pyautogui, и она все та же. Похоже, проблема в другом. Это новая функция:

def screen_part_2(top, left, width, height):
    '''
    Returns a PIL image of the part of the screen
    '''
    img = pyautogui.screenshot(region=(left, top, width, height))

    return img

EDIT2: координаты для второго изображения в порядке. Даже такой код дает ошибку при вызове функции во второй раз (также проверяется печатью координат перед тем, как сделать снимок экрана):

img_1 = f.capture_left_figure('window_name1')
img_1.show()

img_1 = f.capture_left_figure('window_name1')
img_1.show()
...