ソフトウェアに関するコメントを送信できるようにBeta Testerレポートモジュールを作成していますが、レポートにスクリーンショットを含めるオプションがあります。 WindowsでPythonを使用して画面のスクリーンショットを撮るにはどうすればよいですか?.
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)
これはPIL
で実行できます。最初にインストールしてから、次のような完全なスクリーンショットを撮ることができます。
import PIL.ImageGrab
im = PIL.ImageGrab.grab()
im.show()
本当に速い別のアプローチは、 [〜#〜] mss [〜#〜] モジュールです。 ctypes
標準モジュールのみを使用するという点で他のソリューションとは異なるため、大きな依存関係は必要ありません。 OSに依存せず、使用が簡単になります。
from mss import mss
with mss() as sct:
sct.shot()
そして、screenshot.png
ファイルには、最初のモニターのスクリーンショットが含まれています。多くのカスタマイズが可能です。ScreenShot
オブジェクトやOpenCV/Numpy/PIL /などで遊ぶことができます。
ImageGrabモジュールを使用できます。 ImageGrabはWindowsおよびmacOSで動作し、使用するには [〜#〜] pil [〜#〜] (枕)が必要です。以下に小さな例を示します。
from PIL import ImageGrab
snapshot = ImageGrab.grab()
save_path = "C:\\Users\\YourUser\\Desktop\\MySnapshot.jpg"
snapshot.save(save_path)
Pyautoguiユーザーの場合:
import pyautogui
screenshot = pyautogui.screenshot()
スクリーンショットを撮る簡単な方法は、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として保存されます。
実行中の特定の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
詳細は こちら