web-dev-qa-db-fra.com

Obtenez une capture d'écran sur Windows avec Python?

Je suis en train de créer un module de génération de rapports pour les bêta-testeurs afin qu'ils puissent envoyer leurs commentaires sur mon logiciel, mais j'aimerais avoir la possibilité d'inclure une capture d'écran avec le rapport. Comment prendre une capture d'écran de l'écran avec Python sous Windows? J'ai trouvé plusieurs exemples sous Linux, mais je n'ai pas eu beaucoup de chance sous Windows.

36
Zac Brown

Il convient de noter que ImageGrab ne fonctionne que sur MSWindows.

Pour la compatibilité multiplateforme, une personne peut mieux utiliser la bibliothèque 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)
24
Sepero

Cela peut être fait avec PIL. Tout d'abord, installez-le, puis vous pouvez prendre une capture d'écran complète comme celle-ci:

import PIL.ImageGrab

im = PIL.ImageGrab.grab()
im.show()
11
Vivek Gupta

Une autre approche vraiment rapide est le module MSS . Il est différent des autres solutions dans la mesure où il utilise uniquement le module standard ctypes, il ne nécessite donc pas de grandes dépendances. Il est indépendant du système d'exploitation et son utilisation est facilitée:

from mss import mss

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

Et il suffit de trouver le screenshot.png fichier contenant la capture d'écran du premier moniteur. Il y a beaucoup de personnalisations possibles, vous pouvez jouer avec des objets ScreenShot et OpenCV/Numpy/PIL/etc ..

11
Tiger-222

Vous pouvez utiliser le module ImageGrab. ImageGrab fonctionne sur Windows et macOS, et vous avez besoin de PIL (Oreiller) pour l'utiliser. Voici un petit exemple:

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

Pour les utilisateurs de pyautogui:

import pyautogui
screenshot = pyautogui.screenshot()
5
Zaid E.

Un moyen simple de prendre une capture d'écran est d'utiliser Pygame.

 pygame.image.save(Surface, filename)

Où "Surface" est la surface sur laquelle vous prenez une capture d'écran et "nom de fichier" est le chemin d'accès, le nom et le type de fichier où vous enregistrez l'image.

Vous pouvez exporter au format BMP, TGA, PNG ou JPEG. Depuis Pygame 1.8, PNG et JPEG fonctionnent également.

Si aucune extension de fichier n'est spécifiée, elle sera par défaut un fichier .TGA.

Vous pouvez même utiliser la bibliothèque "os" pour enregistrer dans des répertoires de fichiers spécifiques.

Un exemple:

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"))

Cela enregistre tout sur la surface de la surface sur le bureau de l'utilisateur en tant que pic.png

3
CPSuperstore

Si vous souhaitez capturer une application Windows en cours d'exécution, vous devrez acquérir une poignée en faisant une boucle sur toutes les fenêtres ouvertes de votre système.

C'est plus facile si vous pouvez ouvrir cette application à partir du script Python. Ensuite, vous pouvez convertir le processus pid en handle de fenêtre.

Un autre défi est de capturer l'application qui s'exécute sur un moniteur particulier. J'ai 3 moniteurs et j'ai dû comprendre comment capturer les écrans 2 et 3.

Cet exemple prendra plusieurs instantanés d'application et les enregistrera dans des fichiers 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

Les détails sont ici

0
Alex B