【Python】PyAutoGUIでスクリーンショットを取得・保存する

目次

概要

PyAutoGUIの screenshot() 関数を使用して、現在の画面をキャプチャする方法を解説します。 ファイルとして直接保存する手軽な方法から、画像処理ライブラリPillow(PIL)のImageオブジェクトとして取得し、プログラム内で活用する方法、さらに特定の領域のみを切り取る範囲指定キャプチャまでを網羅します。

仕様(入出力)

  • 入力:
    • 保存ファイルパス(オプション)
    • キャプチャする領域 region=(left, top, width, height)(オプション)
  • 出力:
    • 画像ファイルの生成(PNG形式など)
    • Python上のImageオブジェクト(ファイル保存せずメモリ上で扱う場合)
  • 前提:
    • pyautogui ライブラリのインストールが必要です。
    • Linux環境の場合、別途 scrot コマンドが必要になることがあります。

基本の使い方

ファイル名を指定して、画面全体をキャプチャし保存する最も基本的なコードです。

import pyautogui

# 画面全体をキャプチャして "screenshot.png" として保存
pyautogui.screenshot("screenshot.png")

コード全文

「ファイルへの直接保存」「メモリ上での取得」「範囲指定キャプチャ」の3パターンを実装した完全なサンプルコードです。

import pyautogui
import os

def capture_screen_demo():
    """
    スクリーンショット取得の様々なパターンを実行します。
    """
    try:
        # 1. ファイル名を指定して直接保存
        filename_full = "capture_fullscreen.png"
        print(f"全画面キャプチャを保存中: {filename_full}")
        pyautogui.screenshot(filename_full)

        # 2. Imageオブジェクトとして取得してから保存
        # (画像処理を行ってから保存したい場合に有効)
        print("メモリ上に画像を取得中...")
        img = pyautogui.screenshot()
        
        # 取得したオブジェクトは Pillow の Image クラスです
        print(f"画像サイズ: {img.size}")
        
        filename_obj = "capture_from_object.png"
        img.save(filename_obj)
        print(f"オブジェクトから保存完了: {filename_obj}")

        # 3. 範囲を指定してキャプチャ (region引数)
        # region=(左端X, 上端Y, 幅, 高さ)
        region_rect = (0, 0, 300, 300)
        filename_region = "capture_region.png"
        
        print(f"左上300x300をキャプチャ中: {filename_region}")
        pyautogui.screenshot(filename_region, region=region_rect)

        print("全ての処理が完了しました。")

    except Exception as e:
        print(f"エラーが発生しました: {e}")

if __name__ == "__main__":
    capture_screen_demo()

カスタムポイント

screenshot() 関数はシンプルですが、以下の引数で挙動を制御できます。

  • imageFilename (第1引数)
    • 文字列でパスを指定すると、自動的にそのファイル名で保存されます。
    • 省略した場合は保存されず、戻り値としてImageオブジェクトが返されます。
  • region
    • (x, y, width, height) のタプルを指定することで、画面の一部だけを切り取ってキャプチャできます。
    • 処理範囲を限定することで、動作の軽量化や不要な情報の排除に役立ちます。

注意点

  1. 既存ファイルの上書き
    • 指定したファイル名が既に存在する場合、確認なしで即座に上書きされます。
    • 大切なファイルを消さないよう、ファイル名に日時を付与するなどの対策が推奨されます(応用参照)。
  2. OSごとの依存関係
    • Linux: sudo apt-get install scrot などでスクリーンショット用ツールをインストールしないとエラーになる場合があります。
    • Mac/Windows: 通常は追加設定なしで動作します。
  3. 処理速度
    • screenshot() はディスクI/Oや画像変換を伴うため、決して高速ではありません。
    • ゲームのフレーム毎処理のような、ミリ秒単位のリアルタイム性が求められる用途には不向きです。

応用

ファイル名が重複しないように、現在日時をファイル名に含めて連続保存可能なロガーを作成する例です。

import pyautogui
import time
from datetime import datetime
import os

def timestamp_screenshot():
    """
    現在時刻をファイル名に付与してスクリーンショットを保存します。
    """
    # 保存用ディレクトリの作成
    save_dir = "screenshots"
    os.makedirs(save_dir, exist_ok=True)

    # YYYYMMDD_HHMMSS形式でファイル名を生成
    now = datetime.now().strftime("%Y%m%d_%H%M%S")
    filename = f"screen_{now}.png"
    filepath = os.path.join(save_dir, filename)

    print(f"保存中: {filepath}")
    pyautogui.screenshot(filepath)

if __name__ == "__main__":
    timestamp_screenshot()

まとめ

pyautogui.screenshot() は、自動化スクリプトのエビデンス(証拠)保存や、エラー発生時の状況記録に非常に有用です。 region 引数を活用して必要な情報だけを保存したり、日時付きファイル名で管理したりすることで、実用的なログ収集システムを簡単に構築できます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次