15
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

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

こんにちわ
ゴリラです

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

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

使い方

関数は2つのみ

  • CopyToClipboard
  • ReadFromClipboard

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

image.png

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

image.png

仕組み

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

OS コマンド
Mac OS osascript
Windows PowerShell
Linux xclip

Mac OSではApple Scriptを使えばクリップボードにアクセスできます。
Apple Scriptは標準でMac OSに入っているのでライブラリ意外は特に不要です。

# 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を使ってみてください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
15
Help us understand the problem. What are the problem?