プログラミング勉強の備忘録

主にpythonやスマホアプリを作るためのプログラミングで勉強した内容を忘れないように記載していきます。

【Python】スクリーンショットと画像位置の取得

【はじめに】

今回はPythonの「pyautogui」を使ったスクリーンショットの取り方についてのメモです。

「pyautogui」のインストール方法については以下に記載してあります。
chappy88.hatenablog.com

<実施環境>

  • Python 3.7.4
  • PyCharm 2019.2
  • PyAutoGUI 0.9.47

【コードと説明】

<一覧>

コード 説明
screenshot(ファイル名) スクリーンショットを取得
save(ファイル名) スクリーンショットを保存する
screenshot(region=取得範囲) 範囲を指定してスクリーンショットを取得
locateCenterOnScreen(検索対象) 検索対象と同じ画像がある場所を取得

スクリーンショットの取得と保存>

# screenshot()
# save(ファイル名)
import pyautogui

file_name = 'test.png'

prtsc = pyautogui.screenshot()
prtsc.save(file_name)

「screenshot()」でウインドウ全体の画像データを取得することができます。
データを格納した変数に対して「.save(ファイル名)」をつけることで画像データとして保存できます。
「screenshot(ファイル名)」でもファイルを保存することができます。
# screenshot(ファイル名)
import pyautogui

file_name = 'test.png'

prtsc = pyautogui.screenshot(file_name)
|

スクリーンショットの範囲の指定>

# screenshot(region=取得範囲)
import pyautogui

file_name = 'test.png'
prtsc_range = (100, 200, 300, 400)

prtsc = pyautogui.screenshot(file_name, region=prtsc_range)

「screenshot()」に「region=(左上の x 座標, 左上の y 座標, x の長さ, y の長さ)」を与えることで、取得の範囲を指定できます。

<検索対象と同じ画像がある場所を取得>

# locateCenterOnScreen(検索対象)
import pyautogui

x, y = pyautogui.locateCenterOnScreen('フォルダ.png')

print('x:{}\ny:{}'.format(x, y))
# => x:350
#    y:29

「locateCenterOnScreen()」は画像ファイルと同じ画像がある場所の中心を取得します。
今回は、
f:id:chappy88:20190901132413p:plain
を指定して、デスクトップ上のフォルダの位置を取得しました。
検索は左から右に上から順番に行なわれるようで、複数対象がある場合は先に見つかったもののみ値が返されます。

以下のように、「region=(左上の x 座標, 左上の y 座標, x の長さ, y の長さ)」を与えることで検索範囲の指定もできます。

import pyautogui
prtsc_range = (100, 200, 300, 400)

x, y = pyautogui.locateCenterOnScreen('フォルダ.png', region=prtsc_range)

print('x:{}\ny:{}'.format(x, y))
# => x:350
#    y:29

画面上に対象の画像がない場合は下記の様なエラーが出ます。
要因としては、実行時に画面上にその画像がないか、元になっているファイルが適切でないかなので、確認が必要です。

TypeError: 'NoneType' object is not subscriptable

【後書き】

今回は「pyautogui」でスクリーンショットの取り方と、画像の位置の取得方法を記載しました。
何かを起点にスクリーンショットを保存したり、対象のボタンを押すことができたりできるので、自動化にいろいろと使えそうです。

【参考サイト】

今回の作業にあたり、下記サイトを参考にさせて頂きました。
bttb.s1.valueserver.jp