pyauto gui печать экрана с любых видеоисточников - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь сделать снимок экрана с помощью pyautogui и сохранить файл локально.

import pyautogui
def printScreen():
    myScreenshot = pyautogui.screenshot()
    myScreenshot.show()
    return myScreenshot

Но это происходит только из моего первого источника видео , но у меня есть 3 монитора. Как я могу взять снимок экрана для всех видео и сложить изображение рядом?

Есть ли способ сложить изображения, не используя opencv или тяжелую библиотеку?

1 Ответ

0 голосов
/ 15 апреля 2020

pyautogui.screenshot() делает снимок экрана только основного экрана.

Если вы хотите использовать pyauto gui для захвата чего-то с других дисплеев, вы можете использовать его функцию pyautogui.screenshot(region=(0,0, 300, 400)), но в этом случае вы потребуется получить координаты верхнего левого угла окна и размер окна - region принимает 4-х целочисленный кортеж в качестве аргумента (left, top, width, height).

Если вы хотите получить координаты мыши, вы можете использовать например:

pyautogui.position(), который возвратит (x, y), но все равно будет необходимо вычислить ширину и высоту окна. Так что на самом деле вам понадобятся координаты верхнего левого угла и нижнего правого угла.

Потому что:

width = int(bottom_right_x) - int(top_left_x)
height = int(bottom_right_y) - int(top_left_y)

Это поможет понять это:

0,0       X increases -->
+---------------------------+
|                           | Y increases
|                           |     |
|   1920 x 1080 screen      |     |
|                           |     V
|                           |
|                           |
+---------------------------+ 1919, 1079

В вашем случае я бы предложил автоматизировать процесс получения windows координат, из которых вы хотите сделать скриншот. Я написал программу, чтобы проиллюстрировать это, если вы чего-то не понимаете - оставьте комментарий. Для объединения изображений вы наверняка найдете несколько простых решений.

Попробуйте:

import pyautogui
import win32gui
import win32com.client
import mouse
import time


window_amount = int(input("type how many windows you want to capture\n"))
hwnd_list = []

# get the hwnds of windows you want to capture screenshoot from
for i in range(window_amount):
    print('activate the ' + str(i+1) + ' window by clicking its icon on the taskbar')
    mouse.wait(button='left', target_types=('down', 'double'))
    time.sleep(0.2)
    hwnd_list.append(win32gui.GetForegroundWindow())
    print("list of window hwnds: " + str(hwnd_list))

# get the windows coordinates and take a screenshoot
for i in range(window_amount):
    shell = win32com.client.Dispatch("WScript.Shell")
    shell.SendKeys('%')
    win32gui.SetForegroundWindow(hwnd_list[i])
    x, y, x1, y1 = win32gui.GetClientRect(hwnd_list[i])
    x, y = win32gui.ClientToScreen(hwnd_list[i], (x, y))
    x1, y1 = win32gui.ClientToScreen(hwnd_list[i], (x1 - x, y1 - y))
    im = pyautogui.screenshot(region=(x, y, x1, y1))
    im.show()
    time.sleep(0.5)

Вы также можете использовать другой модуль pyautogui, чтобы захватить все дисплеи сразу или полностью экран выбранного дисплея. Например, mss: https://python-mss.readthedocs.io/index.html

Без скриншота только с указанием c windows вы можете упростить процесс, но я не знаю, в этом ли ваша точка зрения .

...