指定したエリアの画像を保存する 【Python】

tkinter

デスクトップ画面上で、透明ウィンドウを使ってエリアを指定すると、ボタン1つで指定エリアの画像を切り出してキャプチャできる Python のソフトウェアです。

以下の環境で動作確認をしています。
環境: Windows 10, Python3 (pyautogui とtkinter を使っています。)

背景

機械学習などでよく知られているように、Python は簡単なスクリプトを書くだけでかなり高度な処理が可能となります。
そこで一例として、Windows 画面上で領域を指定してボタンをクリックすると、指定領域の画像を切り出して自動で保存するスクリプトを作りました。
もともとは自分のパソコン作業を効率化するために作りましたが、公開しておくことにします。
tkinter で透明ウインドウを使うサンプルコードにもなっています。

設定方法

① デスクトップ等に area_capture1.py 等のテキストファイルを作ってください。
② ①のテキストファイルに下記のスクリプトをコピー&ペーストで貼りつけて保存してください。

使い方

③ コマンドプロンプトなどから、②の Python スクリプトを実行してください。
④ 画像をキャプチャしたい領域に、透明ウィンドウの矩形のエリアを合わせてください。
⑤ [capture] ボタンをクリックしてください。Python スクリプトを入れたフォルダ内に画像が保存されます。

スクリプトの概要

・ Python で GUI を作るため、冒頭で tkinter をインポートしています。
・ 指定領域のスクリーンショットを撮るために、pyautogui をインポートしています。

・ メイン画面と、スクリーンショット用の透明ウインドウ画面の2つを作るため、frame1 と frame2 を定義しています。
両方を比べるとわかると思いますが、frame2.attributes( … ) のところで “-alpha” を 0.5 にすることで、透明度(半透明)を設定しています。

まとめ

ウィンドウ上の画像についても自由にキャプチャして保存できるようになりました。また、tkinter で透明ウインドウを作るスクリプトについてまとめました。

たとえば、ネット上のプレゼン資料や、YouTube の画面など、指定箇所を連続でキャプチャしておきたいときに活用できると思います。

他にも、pyautogui、tkinter、scikit-learn などを使った自動化ツールを作成しています。
もし関心があるようでしたら、関連リンクなども参考にしてみてください。効率化を進めましょう!

関連リンク
・ キーコードとマウス座標を取得する 【Python】
・ クリップボードの画像・テキストを自動保存するソフトウェア 【Python】
・ ファイル名を一括変換する 【Python】
・ テキストボックスとボタンの使い方 【tkinter】

サンプルコード:指定エリアの画像を切り出して保存する

import os 
import tkinter as tk1 
import datetime as dt1 
import pyautogui as pag1 
import cv2 

def set_area1(): 
    a1 = frame2.geometry().strip().replace( "x", " " ).replace( "+", " " ).split( " " ) 
    a2 = [0,0,0,0] 
    a2[0] = str( int( a1[2] ) +10 )
    a2[1] = str( int( a1[3] ) +38 )
    a2[2] = str( int( a1[0] )  -2 ) 
    a2[3] = str( int( a1[1] )  -2 ) 
    str2 = " ".join( a2 ) 
    textbox1.delete( 0, tk1.END ) 
    textbox1.insert( 0, str2 ) 
    frame2.attributes( "-alpha", 1.0 ) 
    frame2.attributes( "-transparentcolor", "white" ) 
    str3 = dt1.datetime.now().strftime( "%Y%m%d_%H%M%S" ) + ".png" 
    textbox2.delete( 0, tk1.END ) 
    textbox2.insert( 0, str3 ) 

def click1(): 
    set_area1() 
    a1 = textbox1.get().strip().split( " " ) 
    img1 = pag1.screenshot( region=(int(a1[0]), int(a1[1]), int(a1[2]), int(a1[3])) )  # x, y, w, h 
    path1 = os.path.dirname(__file__) + "\\" 
    file1 = path1 + textbox2.get().strip() 
    img1.save( file1 ) 
    return 1 

frame1 = tk1.Tk()
frame1.title("area_capture v0.1")
frame1.geometry('350x70+1000+100')
frame1.grid()

btn1 = tk1.Button(frame1, text='capture', command=click1, bg='#F9A0A0')
btn1.place(x=220, y=20, width=120)

textbox1 = tk1.Entry(master=frame1)
textbox1.place(x=20, y=100, width=200) 
textbox1.insert(0, "") 

textbox2 = tk1.Entry(master=frame1)
textbox2.place(x=20, y=20, width=180) 
textbox2.insert(0, "") 

frame2 = tk1.Toplevel()

frame2.title("area")
frame2.geometry('800x500+100+100')
frame2.attributes("-alpha", 0.5 ) 
frame2.config(bg="white") 

frame2.grid()
frame2.lift() 

frame1.mainloop()

タイトルとURLをコピーしました