Windowsでのスクリーンキャプチャの自動化方法について調べました。(今回はPythonを利用)
PILを利用する
事前準備
$ pip install Pillow
pyscreenshotというものもありましたが、Windows向けでは結局内部でPILを使ってるので実装は同じです。
$ pip install pyscreenshot
実装例
from PIL import ImageGrab
# full screen
ImageGrab.grab().save("PIL_capture.png")
# 指定した領域内をクリッピング
ImageGrab.grab(bbox=(100, 100, 200, 200)).save("PIL_capture_clip.png")
上記の実装で、フルスクリーンでのスクリーンキャプチャとクリッピング、pigへの出力ができます。
PILが多機能なため、画像の加工や、別形式(jpegなど)での保存も対応してますがそれは別途調べてもらえばと思います。
ただし、この実装では問題が2点ほどありました。
- 2画面での拡張スクリーンでも、片方のスクリーンしかキャプチャされない
- 特定のアプリケーションのみを指定してのキャプチャができない
参考
The ImageGrab Module
pyscreenshot 0.4.2 : Python Package Index
Seleniumを利用する
PILのアプリケーションの指定ができない問題ですが、Webブラウザを指定したい場合はSeleniumを使う方法もあるようです。
(自分のユースケースには合わなかったため未検証)
SeleniumでScreenShot ( Python編 ) - Qiita
pythonからSeleniumでFirefoxを操作し画面キャプチャを保存する - Qiita
How to take partial screenshot with Selenium WebDriver in python? - Stack Overflow
pywinautoを利用する
任意のアプリケーションのスクリーンキャプチャを行う方法としては、 pywinauto
を利用するという手もあります。
事前準備
$ pip install pywinauto
使用例
# coding: UTF-8
from pywinauto import application
from time import sleep
app = application.Application().start("notepad.exe")
sleep(1)
app[u'無題.*メモ帳'].CaptureAsImage().save('window.png')
これで任意のアプリケーション(例ではメモ帳)のスクリーンショットが取れました。
注意点としては、CaptureAsImageは直接描画バッファをとってきているわけではなく、Windowが存在している領域をクリッピングしているだけのようで、上のようなサンプルだとsleepを入れないと立ち上がる前にキャプチャが走ってしまいました。
参考
Pywinauto - pywinauto
What is pywinauto — pywinauto 0.6.0 documentation
pywinautoでGUIのメニューをクリック: サラリーマンとパソコンと僕