Goで画像をクリップボードに保存、読み取るライブラリを作った
初めに
こんにちは ゴリラです
画像をクリップボードにコピー、コピーした画像をクリップボードから読み取るGoのライブラリ clipboard-image を作ったので紹介します。 このライブラリはMac、Linux、Windowsで動作します。
先日 Goでソースコードを画像化するCLIを作った で紹介したCLIではこのライブラリを使っています。
使い方
関数は2つのみ
CopyToClipboard
ReadFromClipboard
画像ファイルをクリップボードにコピーするときは CopyToClipboard
クリップボードから画像ファイルを読み取るときは ReadFromClipboard
しくみ
クリップボードへのアクセスは外部コマンドを用いています。 それらをGoでラップしてライブラリとして提供しています。それぞれ次になっています。
OS | コマンド |
---|---|
macOS | osascript |
Windows | PowerShell |
Linux | xclip |
macOSではApple Scriptを使えばクリップボードにアクセスできます。 Apple Scriptは標準でmacOSに入っているのでライブラリ意外は特に不要です。
# copy to clipboard
osascript -e 'set the clipboard to (read "/path/to/file.png" as TIFF picture)'
# write file from clipboard
osascript -e 'write (the clipboard as «class PNGf») to (open for access "/tmp/file.png" with write permission)'
WindowsではPowershellでクリップボードにアクセスできます。
# copy to clipboard
PowerShell -Command Add-Type -AssemblyName System.Windows.Forms;[Windows.Forms.Clipboard]::SetImage([System.Drawing.Image]::FromFile('/path/to/file.png'));
# write file from clipboard
PowerShell -Command Add-Type -AssemblyName System.Windows.Forms;$clip=[Windows.Forms.Clipboard]::GetImage();if ($clip -ne $null) { $clip.Save('/path/to/file.png') };
Linuxではxclip
というコマンドをインストールことでクリップボードにアクセスできます。
# copy to clipboard
xclip -selection clipboard -t image/png < /path/to/file.png
# write file from clipboard
xclip -selection clipboard -o > /path/to/file.png
これらのコマンドをGoのexec.Command
で実行することで、Goでクリップボードにアクセスできます。
詰まったポイント
xclip
を使う時、標準入力でファイルの中身を渡すのですが、次のように書いても標準入力に渡っていかないです。
標準入力に渡すにはStdinPipe
でpipeを取得してファイルの中身を書き込んだ後にstdinを閉じる必要あります。
xclip
の実装はatotto/clipboardを参考にしました。
さいごに
クリップボード周りは結構苦戦して、いろいろな方に質問してなんとか作れました。 ライブラリとしてはまだ完成形とは考えていなくて、今後も拡張していきたいと考えています。
ちなみに、この記事の画像はVimで書いたコードをcode2img.vimでクリップボードにコピーしてサクッとQiitaにアップロードしたものです。 当初手軽にVimでコードを画像化したいという目的を達成できて、実際使って便利ので満足しています。
コードブロックが使えないチャットやTwitterといったSNSでコード貼りたいときにぜひCLIを使ってみてください。