Goで画像をクリップボードに保存、読み取るライブラリを作った
初めに
こんにちは ゴリラです
画像をクリップボードにコピー、コピーした画像をクリップボードから読み取るGoのライブラリ clipboard-image を作ったので紹介します。 このライブラリはMac、Linux、Windowsで動作します。
先日 Goでソースコードを画像化するCLIを作った で紹介したCLIではこのライブラリを使っています。
使い方
関数は2つのみ
CopyToClipboardReadFromClipboard
画像ファイルをクリップボードにコピーするときは 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を使ってみてください。