web-dev-qa-db-ja.com

Pythonを使用してWindowsでスクリーンショットを取得しますか?

ソフトウェアに関するコメントを送信できるようにBeta Testerレポートモジュールを作成していますが、レポートにスクリーンショットを含めるオプションがあります。 WindowsでPythonを使用して画面のスクリーンショットを撮るにはどうすればよいですか?.

36
Zac Brown

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)
24
Sepero

これはPILで実行できます。最初にインストールしてから、次のような完全なスクリーンショットを撮ることができます。

import PIL.ImageGrab

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

本当に速い別のアプローチは、 [〜#〜] mss [〜#〜] モジュールです。 ctypes標準モジュールのみを使用するという点で他のソリューションとは異なるため、大きな依存関係は必要ありません。 OSに依存せず、使用が簡単になります。

from mss import mss

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

そして、screenshot.pngファイルには、最初のモニターのスクリーンショットが含まれています。多くのカスタマイズが可能です。ScreenShotオブジェクトやOpenCV/Numpy/PIL /などで遊ぶことができます。

11
Tiger-222

ImageGrabモジュールを使用できます。 ImageGrabはWindowsおよびmacOSで動作し、使用するには [〜#〜] pil [〜#〜] (枕)が必要です。以下に小さな例を示します。

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

Pyautoguiユーザーの場合:

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

スクリーンショットを撮る簡単な方法は、Pygameを使用することです。

 pygame.image.save(Surface, filename)

ここで、「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"))

これにより、「表面」表面のすべてがユーザーのデスクトップにpic.pngとして保存されます。

3
CPSuperstore

実行中の特定のWindowsアプリをスナップする場合は、システムで開いているすべてのウィンドウをループしてハンドルを取得する必要があります。

Python script。からこのアプリを開くことができれば、プロセス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

詳細は こちら

0
Alex B