人工知能作っちゃう?

画像処理を中心に人工知能を作っていきます。

Pythonで自動でスクリーンショットを撮る

今日はアプリの描画領域を取得してその部分だけスクリーンショットを撮る時にやったことを備忘録的に紹介します。
Mac専用です。

概要

pyautoguiでディスプレイ解像度を取得。定数にしておいたアプリの幅と高さを計算してスクリーンショットを撮る。

コード

import pyautogui as pa
import subprocess

#今回撮影するアプリの幅
WIDTH = 800

#今回撮影するアプリの高さ
HEIGHT = 450

#アプリのタイトル(クローズや最大化ボタンなど)の高さ
T_HEIGHT = 22

#Macの上のメニューバーとドックは描画領域には含まれないので削除
M_D_HEIGHT = 22+50

#左上
top = []

def main():
    #左上計算
    calcScreenTop()

    #screencaptureコマンドをパイプ付きで実行
    cmd = subprocess.Popen(["screencapture", "-i", "s.png"], stdout=subprocess.PIPE)

    #左上にマウスカーソルを動かす。
    pa.moveTo(top[0], top[1], 0.1)

    #右下にドラッグする
    pa.dragTo(top[0]+WIDTH, top[1]+HEIGHT, 3)

    #撮影
    pa.click()

    #コマンドを終了。
    cmd.stdout.close()



def calcScreenTop():
    #ディスプレイ解像度を取得
    size = pa.size()

    #左上を計算
    #今回撮影するゲームは真ん中に現れるので、、、
    top.append(int((size[0] - WIDTH) / 2)) #X
    top.append(int((size[1] - (HEIGHT + M_D_HEIGHT)) / 2 - T_HEIGHT)) #Y

結果

f:id:manato2cc:20161222220034p:plain
(画像はMari0です。)

感想

最初はpyautoguiのスクリーンショット関数を使おうと思ってたのですが、範囲指定がうまくできなかったのでこちらの方法でやりました。
今回は幅と高さは指定しなければいけませんでしたが、可変幅のものにも対応できるようにしたいと思います。