PyAutoGUIの使い方 スクリーンショット・画像認証編

今回はスクリーンショットを撮ったり、
画像認識で対象のスクリーン座標をもとめてクリックしたり、
そんなことをやってみます。


スクリーンショットを撮る

>>> import pyautogui
>>> sc = pyautogui.screenshot()

 
エラーが出る方はこちらを試してみてください。
PyAutoGUIでスクリーンショットが撮れない


スクリーンショットを撮って指定した名前で保存する

>>> import pyautogui
>>> pyautogui.screenshot('filename.png')

 

以下のやり方でもできます。

>>> import pyautogui
>>> sc = pyautogui.screenshot()
>>> sc.save('filename.png')

 
 


指定した範囲のスクリーンショットを撮る

>>> import pyautogui
>>> sc = pyautogui.screenshot(region=(100, 200, 300, 400))

左上のx座標=100, 左上のy座標=200 の位置から幅300, 高さ=400
の範囲を撮っています。

 
 


画像を使ってボタンを押す

まずは準備として押したいボタンの画像を準備します。
スクリーンショットを撮ってペイントでトリミングします。
今回はこんな画像を準備しました。
pythonを起動しているフォルダにsearch.pngという名前で保存しました。

>>> import pyautogui
>>> x, y = pyautogui.locateCenterOnScreen('search.png')
>>> pyautogui.click(x, y)

locateCenterOnScreenは画面上から引数で与えた画像と同じ場所を探して、
その真ん中の座標を返します。
また失敗するとNONEを返します。
この時、一旦画面のスクリーンショットを撮ってから、探索しているようなので、
ボタンが何かの陰に隠れていると、
TypeError: ‘NoneType’ object is not iterable
こんなエラーが出ます。

従って、上記コードを実行するときはボタンが見える状態で
実行する必要があります。

ちなみに
最初は電卓を例にテストしてみたのですが、
Windows10の電卓は半透明な状態となっており、
押したいボタンの裏の状態によっては失敗してしまうようです。

もう一つ別のやり方でやってみます。

>>> import pyautogui
>>> p = pyautogui.locateOnScreen('search.png')
>>> x, y = pyautogui.center(p)
>>> pyautogui.click(x, y)

locateOnScreenでは左上のx座標, 左上のy座標, 幅, 高さのタプルを返します。
centerではタプルから中心のx,y座標を求めています。

これらには以下のようなオプションを付けることができます。

>>> import pyautogui
>>> p1 = pyautogui.locateOnScreen('search1.png', grayscale=True)
>>> p2 = pyautogui.locateOnScreen('search2.png', region(100, 200, 300, 400))

grayscaleではその名の通りグレースケールでの探索ができます。
30%程度のスピードアップになるようです。

regionでは左上のx座標, 左上のy座標, 幅, 高さのタプルを与えることで、
その範囲内のみ探索することができます。
 
 


指定座標のRGB値を取得する

>>> import pyautogui
>>> rgb = pyautogui.pixel(50, 100)
>>> rgb
(41, 128, 185)

pixelでは指定座標のrgb値をタプルで返します。

 
 


指定座標のRGB値がマッチするか

>>> import pyautogui
>>> pyautogui.pixelMatchesColor(100, 200, (130, 135, 144))

上の例では座標(100, 200)のrgb値が(130, 135, 144)であればtrueを返します。
 
 

>>> import pyautogui
>>> pyautogui.pixelMatchesColor(100, 200, (130, 135, 144), tolerance=10)

こうすることでマッチする範囲を広げることができます。

 
 

【関連記事】
PyAutoGUIの具体的な使用例
PyAutoGUIでgoogle検索を自動化
 

PyAutoGUIの使い方詳細
PyAutoGui 使い方 マウス操作編
PyAutoGUIの使い方 キーボード操作編
 
 

PyAutoGUIの使い方 スクリーンショット・画像認証編」への3件のフィードバック

  1. サイトを参考にさせていただいています.コード書いている中で画像を使ってボタンを押すところで質問があります.実際にやってみたのですが,画面にボタンが見える状態で行っても
    「TypeError: ‘NoneType’ object is not iterable」といったエラーが起きます.これはどうすればいいのでしょうか.まだ初めてすぐなのでご教授をお願いしたいです.

    • コメントありがとうございます。
      実際、どのようなボタン画像でお試しでしょうか?
      pyautoguiの処理はスクリーン全体のスクリーンショットを撮り、
      その後、ボタンの画像と一致する座標を探しています。

      記事中にも書きましたが、半透明の画像ですと、
      スクリーンショットとボタン画像が一致せず、
      そのようなエラーが出てしまうことがあります。

      未確認ですが、おそらく画素ごとに色が同じかどうかを判定する
      アルゴリズムかと思われますので、
      画像のサイズや解像度の違いなども
      判定に影響するかと思います。

      • お返事大変遅くなり申し訳ありません.
        なるほどそういうことですか..
        いったん他の画像で試してみようと思います.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です