こんにちは、くのへです。
Pythonでデスクトップの作業を効率化するミニツールを作成していくシリーズ、今回は第5回目です!
普段、資料作成などでPCの画面をキャプチャして画像として保存したい場面、よくありますよね。
Windows標準機能のSnipping Tool(Win+Shift+S)などを使えば簡単にキャプチャできますが、クリップボードにコピーされた画像をファイルとして保存するには、さらに別の操作が必要になります。
そこで今回は、クリップボードにコピーされた画像をワンクリックでデスクトップにPNGファイルとして保存できる、そんな超便利なPythonツールを作成します!
こちらがYouTubeの解説動画です。
画像をクリップボードにコピーした状態で、作成したPythonファイルをダブルクリックするだけで、デスクトップに画像ファイルが保存されます。
ファイル名には自動的に日付が付くので、整理もしやすいです。
もし、クリップボードに画像データ以外(テキストなど)が入っていた場合は、エラーメッセージを表示するように工夫しました。
手動でSnipping Toolを起動して、範囲指定して、保存ボタンを押して、ファイル名をつけて…という作業が、このツールを使えば一瞬で完了します。作業効率が爆上がりすること間違いなしです!
さらに、このツールをCLaunchのようなランチャーソフトに登録しておけば、キーボードショートカット一つで実行することも可能になります。CLaunchについても以前別の動画で紹介しているので、興味があればぜひご覧ください。
今回のテーマとスキルアップ内容
今回のツール作成を通して学べることはこちらです。
- テーマ:クリップボードの画像を保存!
- スキルアップ内容:
– Pillow (PIL) ライブラリの習得
– try, except構文の習得
クリップボードの画像を保存するコード
今回のツールを作成するためのPythonコードはこちらです。
import os
import tkinter as tk
from tkinter import messagebox
from PIL import ImageGrab
import datetime
try:
image = ImageGrab.grabclipboard()
desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
date_str = datetime.datetime.now().strftime("%Y%m%d")
# ファイル名のベースを作成
file_name = f"{date_str}_画像.png"
file_path = os.path.join(desktop_path, file_name)
# ファイルが既に存在する場合、連番を付与
counter = 1
while os.path.exists(file_path):
file_name = f"{date_str}_画像({counter}).png"
file_path = os.path.join(desktop_path, file_name)
counter += 1
image.save(file_path, "PNG")
except:
root = tk.Tk()
root.withdraw()
messagebox.showinfo("情報", "クリップボードに画像データがありません。")
root.destroy()
コード全体を見ると少し長く感じるかもしれませんが、過去の動画で解説した内容も含まれています。今回の新しい要素は主に画像を扱う部分(PILライブラリ)とエラー処理(try-except構文)です。
このコードは、動画の概要欄にも貼り付けてありますので、コピー&ペーストで自由に使っていただいて構いません。
また、コードを見ながらこのブログや動画を読み進めていただくのも良いかと思います。
Pillow (PIL) ライブラリについて
まず、クリップボードの画像を扱うために使用したのが Pillow (PIL) ライブラリです。
- このライブラリは画像ファイルの読み込み、操作、保存などができるライブラリです。(PIL:Python Imaging Library)
- 元々はPILという名前で開発されていましたが、開発が滞ったため、その後継として2010年頃から「Pillow」が広く使われるようになりました。
- pip install pillow でインストールしますが、コードでインポートする際は from PIL import ImageGrab のように PIL と書く必要がある点にご注意ください。ここが少しややこしいですね。
今回のコードでは、Pillowライブラリ内のImageGrabモジュールを使用しています。
- from PIL import ImageGrab と書けば使えます。
- image = ImageGrab.grabclipboard()
- このコードで、クリップボードの画像データを取得し、imageという変数に格納します。
- image変数は画像オブジェクトとして扱われます。
- クリップボードに画像データがない場合はエラーが発生します。
- image.save(file_path, “PNG”)
- 取得した画像オブジェクト(image)のsaveメソッドを使ってファイルを保存します。
- 第1引数に保存先のファイルパス、第2引数に保存形式(ここでは”PNG”)を指定します。
- 非常にシンプルに画像を保存できる便利なメソッドです。
このように、ImageGrab.grabclipboard()で画像を取得し、image.save()で保存する、という2つの命令が今回の核心部分となります。
ファイルパス生成とファイル名重複回避について
コードの途中で、ファイルパスを生成したり、もし既に同じ名前のファイルが存在したらファイル名の末尾に連番を付けたりする処理が入っています。
- desktop_path = os.path.join(os.path.expanduser(“~”), “Desktop”)
- デスクトップのパスを取得しています。
- date_str = datetime.datetime.now().strftime(“%Y%m%d”)
- 現在の年月日をyyyymmdd形式の文字列として取得しています。
- file_name = f”{date_str}_画像.png”
- ファイル名のベースを作成しています。
- file_path = os.path.join(desktop_path, file_name)
- デスクトップパスとファイル名を結合して完全なファイルパスを作成しています。
- while os.path.exists(file_path): …
- 指定したファイルパスにファイルが存在するかチェックし、存在する場合はファイル名に連番を追記しています。
これらの処理については、Pythonデスクトップ簡易アプリ作成シリーズの1本目で詳しく解説していますので、もし「ここがよく分からないな」という場合は、ぜひそちらも合わせてご覧いただけると理解が深まると思います。
try, except構文について
今回のコードで新しく登場する大きな要素が try, except構文 です。
- try, except構文は、コード中にエラーが発生した場合でも、プログラムが停止せずに柔軟に処理を進めるための構文です。
- 基本的な流れは以下のようになります。
- まず try の中の処理を行います。
- tryの処理中にエラーが発生したら、それ以降のtry内の処理をスキップし、except内のコードを実行します。
- tryの処理中にエラーが発生しなければ、except内のコードは実行されません。
今回のツールでは、ImageGrab.grabclipboard()を実行した際に、クリップボードに画像データがないとエラーが発生します。
- tryブロック: クリップボードからの画像取得、ファイルパス生成、ファイル名重複回避、画像ファイルの保存処理が含まれています。
- exceptブロック: クリップボードに画像データがないなどの理由でtryブロックでエラーが発生した場合に実行されます。
exceptブロックでは、tkinterを使って「クリップボードに画像データがありません。」という情報メッセージボックスを表示するようにしています。
- root = tk.Tk()
- tkinterのルートウィンドウを作成します。
- root.withdraw()
- 通常表示されるtkinterのメインウィンドウを非表示にします。メッセージボックスだけを表示したい場合に便利です。
- messagebox.showinfo(“情報”, “クリップボードに画像データがありません。”)
- 情報レベルのメッセージボックスを表示します。第1引数がタイトル、第2引数がメッセージ内容です。
- root.destroy()
- 作成したtkinterのルートウィンドウを破棄します。
tkinterを使ったメッセージボックスの表示方法についても、Pythonデスクトップ簡易アプリ作成シリーズの2本目で詳しく解説していますので、そちらも参照してみてください。
このように、try-except構文を使うことで、クリップボードに画像データがある場合は画像の保存処理を行い、画像データがない場合はエラーメッセージを表示する、という処理の切り替えをスムーズに行うことができます。
まとめ
今回はPythonのPillow (PIL) ライブラリとtry-except構文を使って、クリップボードの画像をデスクトップに保存する便利なツールを作成しました。
- Pillow (PIL) ライブラリ: 画像操作に特化した強力なライブラリで、ImageGrab.grabclipboard()で画像取得、image.save()で画像保存が簡単に行えます。
- try, except構文: エラーが発生した場合でもプログラムを停止させず、代替処理を実行するために役立つ構文です。
このシリーズでは、過去に学んだ内容を組み合わせながら、どんどん実用的なアプリケーションを作成していきます。
1本目、2本目などの動画やブログ記事をまだご覧になっていない方は、ぜひそちらもチェックして、基礎から一緒にスキルアップしていきましょう!
次回もまた便利なPythonツールを作っていきますので、お楽しみに!