15
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

こんにちわ
ゴリラです

画像をクリップボードにコピー、コピーした画像をクリップボードから読み取る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を使ってみてください。

15
15
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?