クリップボードの画像を自動保存するソフトウェアを作成しましたので、サンプルコードを公開します。
テキスト文字列についても自動保存します。
Python を使っていますのであらかじめインストールしておく必要があります。
以下の環境で動作確認をしています。
環境:Windows 10、Python 3.x(、Anaconda)
背景
画面キャプチャ・スクリーンショットの手順が煩雑
PC の画面をワンショットで記録しておきたいとき、通常は描画アプリなどで画像を保存することになると思います。
Windows 標準のアプリを使う場合は、アプリ起動 → キャプチャする → 名前をつける → 保存を実行する、というステップを踏む必要があります。
画像の取得が1枚だけであれば、特に問題はありません。
しかし、取得したい画像が数十枚に増えてくると、名前をつけるだけでもとても煩雑です。これにテキストの保存が加わると、さらに大変です。
やりたいこと: クリップボードの画像やテキストを自動保存したい
そこで、クリップボード内に画像やテキストがあったら、判別して自動保存するソフトウェアを作成しました。
クリップボードに画像やテキストをコピーすると、クリップボード内の画像やテキストを判別して、日付・時刻つきのファイル名で自動保存します。
具体的な活用例としては、今回のソフトウェアを使って、まず最初に必要となる/欲しくなる可能性のある画像や文字列をすべてキャプチャします。
つぎに、テキストや画像の取得をすべて終えたら、中から使えそうなテキスト、画像、一番うまく撮れたショットだけをピックアップして活用します。こうすることで作業効率が格段に上がります。
(人がマウス操作をしてファイル名を手打ちするのに比べると数十~数百倍作業効率が上がると思います。また、作業後、不要なファイルを一括削除するのは簡単です。)
使い方
① clipboardcapture.py 等の名前でテキストファイルを作成し、末尾のサンプルコードをコピー&ペーストして保存してください。
② つぎに、コマンドプロンプトで “python clipboardcapture.py” 等と入力して実行してください。GUI が表示されます。もしも起動をもっと簡単にしたい場合は、下記リンクを参照して、バッチファイルを作ってみてください。ダブルクリックで起動できます。
③ 「start」ボタンをクリックすると、クリップボード内にコピーされている画像、テキストを自動で取得して保存します。「stop」をクリックすると停止します。
たとえば、上記のアプリを動作させた状態で、ブラウザやアプリの画面を選択し、キーボードの [ctrl] + [alt] + [prt sc] の3つのボタンを同時に押してみてください。
すると、クリップボードにコピーされた画像が、python スクリプトと同じ場所に保存されます。画像が取得されると、クリップボードのデータはクリアされます。
テキストついても同じです。任意のテキストデータを準備し、テキスト部分を選択して、[ctrl] + [c] を押します(選択した文字列をクリップボードにコピーします)。
すると、クリップボードの内容が自動的にテキストファイル形式で保存されます。
他の例として、Word、テキストエディタ、HTML などを開いて選択した状態とし、[ctrl] + [a] ですべて選択し、[ctrl] + [c] とすると、テキストデータの取り込みができます。
ソフトウェアの説明
クリップボード内のデータを常時監視する
・ GUI 上でボタンをクリックしてアプリを稼働させると、スクリプトの self.master.after( 2000, self.update ) としたところで、2秒おきに self.capture1() を繰り返し実行します。これにより、クリップボードを監視します。
pyperclip でテキストの取得を試みる & ImageGrab で画像を取得する
・ 一定時間で繰り返し実行される capture1() 内で、ImageGrab.grabclipboard() と pyperclip.paste().strip().replace( .. ) を実行し、クリップボード内の画像とテキストの取得を試みます。
・ ポイントとなるのは、str1 = pyperclip.paste() となっているところです。
pyperclip.paste() は、クリップボード内の「テキスト」の取得を行います。
もし、テキストの取得に成功した場合、str1 は空欄ではなくなります。
・ そこで、続く if 文の部分で、テキストが取得できたかどうかを判別します。これにより、クリップボード内にテキストがあるかどうかを判断します。
テキストが取得できた場合、if 文の前半の部分で、*.txt 形式で保存します。
・ テキストの取得ができない場合、クリップボード内に画像がある場合と、画像がない場合とがあります。
そこで、elif 文で画像の有無を判別します。
画像があった場合は、画像を保存します(ここでは jpg 形式としています)。
・ クリップボードから、テキストあるいは画像が取得できた場合、それぞれファイル名を設定して保存しています。
・ データの取得に成功したとき、クリップボード内にデータを残したままですと、クリップボードを繰り返し監視する際、同じデータをずっと保存し続けてしまいます。そこで、データの取得・保存に成功した場合は、クリップボード内を空にします。
具体的には、pyperclip.copy( “” ) を実行し、カラとなっているデータ “” をコピーすることで、クリップボードを空にします。
これで、クリップボード内にデータがコピーされるのを待ち受ける状態となります。
まとめ
クリップボード内の画像、テキストを自動保存するソフトウェアをまとめました。
作業手順書などを作成していて、いくつか画面キャプチャをしたいときなど、活用してみてください。
なお、ここではアプリの例を挙げましたが、もう少しベーシックなクリップボードの使い方について、関連リンクなどにまとめています。また、こうして取得した画像を結合して gif ファイルを作ることも可能です。
もし関心のある方は参考にしてみてください。
関連リンク
・ クリップボードの使い方 サンプルコード
・ 画像に文字を書いて出力する 【Python】
・ 指定したエリアの画像を保存するソフトウェア 【tkinter】
・ tkinter テキストボックスとボタン サンプルコード
・ 動画作成ソフトウェア【Python & mp4, gif】
サンプルコード:クリップボードの自動監視&自動保存
# -*- coding: utf-8 -*-
from PIL import ImageGrab, Image
import tkinter
import time as tm1
import datetime as dt1
import pyperclip
import os
class Application( tkinter.Frame ):
def __init__(self, master):
super().__init__(master)
self.flag1 = 0
self.path1 = os.path.dirname(__file__) + "\\"
self.pack()
master.title(u"clipboard capture")
master.geometry("300x40")
self.label1 = tkinter.Label(text='')
self.label1.place(x=10, y=10)
self.btn1 = tkinter.Button(master, text='start', command=self.btn_click1, bg='orange')
self.btn1.place(x=180, y=10, width=100)
master.after(2000, self.update)
def update(self):
if self.flag1 == 1:
datetime1 = dt1.datetime.now().strftime( "%Y%m%d_%H%M%S" )
file1 = datetime1
self.label1["text"] = file1
ret1 = 0
ret1 = self.capture1( file1 )
self.master.after(2000, self.update)
def capture1( self, file0 ):
ret1 = "0"
im1 = ImageGrab.grabclipboard()
str1 = pyperclip.paste().strip().replace( "\r\n", "\n" )
if str1 != "":
print( str1 )
file1 = self.path1 + str(file0) + ".txt"
write1( file1, str1 )
pyperclip.copy("")
ret1 = "1"
elif isinstance(im1, Image.Image):
file1 = self.path1 + str(file0) + ".jpg"
print( file1 )
im1.save( file1 )
pyperclip.copy("")
ret1 = "1"
return ret1
def btn_click1( self ):
self.label1.config( text = '' )
if self.flag1 == 0:
self.flag1 = 1
self.btn1.config(bg = 'red', text = 'stop' )
else:
self.flag1 = 0
self.btn1.config(bg = 'orange', text = 'start' )
def write1( file1, str1 ):
with open( file1, 'w', encoding='utf-8' ) as f1:
f1.write( str1 )
return 0
def main():
root = tkinter.Tk()
app = Application( master=root )
app.mainloop()
if __name__ == "__main__":
main()