Получить скриншот на Windows с Python? - PullRequest
35 голосов
/ 17 мая 2010

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

Ответы [ 7 ]

24 голосов
/ 10 апреля 2012

Стоит отметить, что 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)
10 голосов
/ 05 июля 2017

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

from mss import mss

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

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

9 голосов
/ 16 марта 2018

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

import PIL.ImageGrab

im = PIL.ImageGrab.grab()
im.show()
5 голосов
/ 13 января 2018

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

import pyautogui
screenshot = pyautogui.screenshot()
5 голосов
/ 29 декабря 2016

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

from PIL import ImageGrab
snapshot = ImageGrab.grab()
save_path = "C:\\Users\\YourUser\\Desktop\\MySnapshot.jpg"
snapshot.save(save_path)
3 голосов
/ 24 августа 2016

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

 pygame.image.save(Surface, 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"))

Это сохраняет все на «поверхности» Surface на рабочий стол пользователя как pic.png

0 голосов
/ 20 сентября 2018

Если вы хотите привязать конкретное работающее приложение 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

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

...