Goで画像をクリップボードに保存、読み取るライブラリを作った

初めに

こんにちは ゴリラです

画像をクリップボードにコピー、コピーした画像をクリップボードから読み取るGoのライブラリ clipboard-image を作ったので紹介します。 このライブラリはMac、Linux、Windowsで動作します。

先日 Goでソースコードを画像化するCLIを作った で紹介したCLIではこのライブラリを使っています。

使い方

関数は2つのみ

  • CopyToClipboard
  • ReadFromClipboard

画像ファイルをクリップボードにコピーするときは CopyToClipboard

image.png

クリップボードから画像ファイルを読み取るときは ReadFromClipboard

image.png

しくみ

クリップボードへのアクセスは外部コマンドを用いています。 それらをGoでラップしてライブラリとして提供しています。それぞれ次になっています。

OSコマンド
macOSosascript
WindowsPowerShell
Linuxxclip

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を使う時、標準入力でファイルの中身を渡すのですが、次のように書いても標準入力に渡っていかないです。

image.png

標準入力に渡すにはStdinPipeでpipeを取得してファイルの中身を書き込んだ後にstdinを閉じる必要あります。 xclipの実装はatotto/clipboardを参考にしました。

image.png

さいごに

クリップボード周りは結構苦戦して、いろいろな方に質問してなんとか作れました。 ライブラリとしてはまだ完成形とは考えていなくて、今後も拡張していきたいと考えています。

ちなみに、この記事の画像はVimで書いたコードをcode2img.vimでクリップボードにコピーしてサクッとQiitaにアップロードしたものです。 当初手軽にVimでコードを画像化したいという目的を達成できて、実際使って便利ので満足しています。

コードブロックが使えないチャットやTwitterといったSNSでコード貼りたいときにぜひCLIを使ってみてください。


Go

2020/08/08 00:00