Ubuntuでxclipを使いpythonからクリップボードへ画像をコピー

コンピュータ

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から呼び出せれば何とかなりそうな気もしますが、実際試してみないと何とも言えません。

コメント