Подтвердить что ты не робот

Получить скриншот на Windows с Python?

Я создаю модуль отчетности бета-тестеров, чтобы они могли отправлять свои комментарии на мое программное обеспечение, но я хотел бы иметь возможность включить скриншот с отчетом. Как сделать снимок экрана с помощью Python в Windows? Я нашел несколько примеров в Linux, но не имел большой удачи в Windows.

4b9b3361

Ответ 1

Стоит отметить, что ImageGrab работает только на MSWindows.

Для совместимости с кросс-платформой человеку лучше всего использовать библиотеку wxPython. http://wiki.wxpython.org/WorkingWithImages#A_Flexible_Screen_Capture_App

import wx
wx.App()  # Need to create an App instance before doing anything
screen = wx.ScreenDC()
size = screen.GetSize()
bmp = wx.EmptyBitmap(size[0], size[1])
mem = wx.MemoryDC(bmp)
mem.Blit(0, 0, size[0], size[1], screen, 0, 0)
del mem  # Release bitmap
bmp.SaveFile('screenshot.png', wx.BITMAP_TYPE_PNG)

Ответ 2

Другой очень быстрый подход - это модуль MSS. Он отличается от других решений тем, что использует только стандартный модуль ctypes, поэтому он не требует больших зависимостей. Это не зависит от ОС, и его использование стало проще:

from mss import mss

with mss() as sct:
    sct.shot()

И просто найдите файл screenshot.png содержащий снимок экрана первого монитора. Существует множество возможных настроек, вы можете играть с объектами ScreenShot и OpenCV/Numpy/PIL/и т.д..

Ответ 3

Это можно сделать с помощью PIL. Сначала установите его, затем вы можете сделать полный снимок экрана следующим образом:

import PIL.ImageGrab

im = PIL.ImageGrab.grab()
im.show()

Ответ 4

Вы можете использовать модуль ImageGrab. ImageGrab работает на Windows и macOS, и вам нужен PIL (Pillow) для его использования. Вот небольшой пример:

from PIL import ImageGrab
snapshot = ImageGrab.grab()
save_path = "C:\\Users\\YourUser\\Desktop\\MySnapshot.jpg"
snapshot.save(save_path)

Ответ 5

Для пользователей pyautogui:

import pyautogui
screenshot = pyautogui.screenshot()

Ответ 6

Простой способ сделать снимок экрана через Pygame.

 pygame.image.save(Surface, filename)

Где "Поверхность" - это поверхность, на которой вы снимаете скриншот, а "filename" - это путь к файлу, имя и тип, в котором вы сохраняете свое изображение.

Вы можете экспортировать BMP, TGA, PNG или JPEG. С Pygame 1.8, PNG и JPEG также работают.

Если не указано расширение файла, оно по умолчанию будет иметь .TGA файл.

Вы даже можете использовать библиотеку "os" для сохранения в определенных файловых каталогах.

Пример:

import os
import pygame
surface = pygame.display.set_mode((100, 100), 0, 32)
surface.fill((255, 255, 255))
pygame.draw.circle(surface, (0, 0, 0), (10, 10), 15, 0)
pygame.display.update()
pygame.image.save(surface, os.path.expanduser("~/Desktop/pic.png"))

Это сохраняет что-либо на поверхности "поверхность" на рабочем столе пользователя как pic.png

Ответ 7

Если вы хотите привязать конкретное работающее приложение Windows, вам нужно получить дескриптор, перебрав все открытые окна в вашей системе.

Это проще, если вы можете открыть это приложение из скрипта Python. Затем вы можете конвертировать pid процесса в дескриптор окна.

Еще одной проблемой является привязка приложения, которое запускается на конкретном мониторе. У меня есть 3 монитора системы, и мне пришлось выяснить, как привязать дисплей 2 и 3.

В этом примере будут сделаны несколько снимков приложения и сохранены их в файлы JPEG.

import wx

print(wx.version())
app=wx.App()  # Need to create an App instance before doing anything
dc=wx.Display.GetCount()
print(dc)
#e(0)
displays = (wx.Display(i) for i in range(wx.Display.GetCount()))
sizes = [display.GetGeometry().GetSize() for display in displays]

for (i,s) in enumerate(sizes):
    print("Monitor{} size is {}".format(i,s))   
screen = wx.ScreenDC()
#pprint(dir(screen))
size = screen.GetSize()

print("Width = {}".format(size[0]))
print("Heigh = {}".format(size[1]))

width=size[0]
height=size[1]
x,y,w,h =putty_rect

bmp = wx.Bitmap(w,h)
mem = wx.MemoryDC(bmp)

for i in range(98):
    if 1:
        #1-st display:

        #pprint(putty_rect)
        #e(0)

        mem.Blit(-x,-y,w+x,h+y, screen, 0,0)

    if 0:
        #2-nd display:
        mem.Blit(0, 0, x,y, screen, width,0)
    #e(0)

    if 0:
        #3-rd display:
        mem.Blit(0, 0, width, height, screen, width*2,0)

    bmp.SaveFile(os.path.join(home,"image_%s.jpg" % i), wx.BITMAP_TYPE_JPEG)    
    print (i)
    sleep(0.2)
del mem

Подробности здесь