pythonでクリップボードへ画像をコピーする方法を探していてxclipを使う方法に行き着きました。
まずxclipをインストール
sudo apt install xclip
次にxclipで画像ファイル→クリップボードへコピーする動作を確認
xclip -selection clipboard -t image/png < /home/asagao/Pictures/sy9vpsr2.zd5.png
gimpに貼り付けて画像がコピーされていることを確認
動作確認ができたのでpythonでsubprocessを使い外部コマンドとしてxclipを呼び出し実行
import subprocess
fi = open("/home/asagao/Pictures/00036-214376861.png")
subprocess.run(['xclip', '-selection', 'clipboard', '-t', 'image/png'], stdin=fi)
subprocessのstdinへオープンした画像ファイルのハンドルを引数に渡すことで、標準入力で画像ファイルを引き渡すことに成るようです。
スクリプトを実行後、先ほどと同様にgimpに貼り付けて画像がコピーされていることを確認
OpenCVで画像を読み込みグレースケール化、一時ファイルへ保存→クリップボードへコピーするスクリプトを作成
import subprocess
import cv2
import os
import tempfile
img = cv2.imread("/home/asagao/Pictures/00036-214376861.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
with tempfile.NamedTemporaryFile(delete=False) as t:
tmp_path = t.name + ".png"
#print(tmp_path)
cv2.imwrite(tmp_path, gray)
fi = open(tmp_path)
subprocess.run(['xclip', '-selection', 'clipboard', '-t', 'image/png'], stdin=fi)
実行してgimpへ貼り付けるとグレスケール化された画像が確認できました。
一時ファイルが残ってしまいますが(tmpにファイルがどんどん増える)とりあえず希望する動作をしてくれるようになりました。
大概のことが出来てしまう今日のスクリプト言語対し、xclipはクリップボードとのデータの受け渡しというシンプルな機能のみ提供するコマンドです。
pythonからクリップボードへ画像ファイルを送るというテーマで、外部コマンドと連携する方法はUNIXぽくて良いと思います。
標準入力やパイプライン、リダイレクトなどをしっかりと学ばないといけないと思いました。(多分必要に迫られないとやらないと思いますが。)
Ubuntu(Linux)ではxclipで解決しましたがWindows環境では別な方法を考える必要があります。
PowerShellのSet-Clipboardをsubprocessから呼び出せれば何とかなりそうな気もしますが、実際試してみないと何とも言えません。
コメント