ターミナル上に画像を表示する方法いろいろ

ターミナル*1に画像表示したいですよね。

先日w3m*2ブラウジングしてたら、テキストブラウザなのに画像が表示されて驚きました。
f:id:u10e10:20161213205541g:plain:w500

gnome-terminal, konsole, terminologyの3つの端末で表示されたので端末共通の画像表示方法がありそうです。 端末上での画像表示について調べたこと書きます。
(結論を言うと、端末に共通の表示方法はなかった)

この記事はKogakuin Univ Advent Calendar 2016 - Adventarの13日目です。

目次

比較元画像

この画像が飽きるほど出てきますが、我慢してください。 f:id:u10e10:20161213214732p:plain:w400
※なにかを頑張ったわけではありません。

アスキーアート

「端末に画像」と聞いて最初に思いつくのはアスキーアートだと思います。 画像をAA化するサイト を使用してフォントサイズ7で出力しました。
f:id:u10e10:20161213215842p:plain:w400

エスケープシーケンス

ターミナルでもエスケープシーケンスを使えば色付き文字を出力できます。 f:id:u10e10:20161213222016p:plain

上記コードの関数版
カラーコード表示スクリプト

エスケープシーケンスについて詳しくは下記。
エスケープシーケンスを体感する - ザリガニが見ていた...。

画像表示

下記のスクリプトを使用
ターミナルに画像を表示する - Qiita

フォントサイズ12(普段)
f:id:u10e10:20161213224208p:plain:w400

フォントサイズ5(使用中端末の最小値)
f:id:u10e10:20161213224220p:plain:w400

改良版

「ターミナルに画像を表示する」の画質向上を試みる - Qiita

フォントサイズ12
f:id:u10e10:20161213232040p:plain:w400

フォントサイズ5
f:id:u10e10:20161213231538p:plain:w400

pxl

最近Go製のCLIツールをよく目にします。
pxlはターミナルに画像を表示するGo製ツールです。

go get github.com/ichinaski/pxl
pxl img.png

GitHub - ichinaski/pxl: Display images in the terminal

フォントサイズ12
f:id:u10e10:20161213233531p:plain:w400

フォントサイズ5
f:id:u10e10:20161213232655p:plain:w400

縦に潰れてますが、かなり鮮明です。
※pxlは今までのものと違い仮想画面に描画しています。

DRCS(Soft Character Set)

平たく言うと画像をフォントとして扱う端末機能ですが対応端末は少ない。
vimと端末エミュレーション - Qiita  Soft Character Set (DRCS) - Togetterまとめ

Sixel

また平たく言うとエスケープシーケンスで画像を表現する端末機能。同じく対応端末は少ない*3
文字として表現できるので、対応端末ならssh先の画像をSixelで出力して手元で確認できます。

go-sixelで試してみた。 GitHub - mattn/go-sixel

go get github.com/mattn/go-sixel/cmd/gosr
gosr img.png
非対応端末

文字が沢山出る
f:id:u10e10:20161214010637p:plain:w400

xterm -ti 340

色がおかしい(パッチを当てないと?)
f:id:u10e10:20161214010159p:plain:w400

mlterm

f:id:u10e10:20161214010447p:plain:w400

画像をそのまま表示できたので、対応端末が増えると良いですね。

参考資料
長編まとめ・Sixel Graphics復活への動き(1) (26ページ目) - Togetterまとめ
Sixel 情報 - ダメ出し Blog
OS X Mavericksにmltermとlibsixelをインストールして端末で画像を表示する - Keep It Simple, Stupid
ターミナル上でgnuplotの出力をターミナルに直接描画する - Qiita
Sixel Graphicsを活用したアプリケーションの御紹介 - Qiita

terminology

terminologyはモダンなカッコイイ系端末で、独自の便利コマンドを搭載しています。
youtu.be

tylsはlsにサムネイルが付きます。
f:id:u10e10:20161214032929p:plain

tycatは引数のファイル(画像、音楽、動画)を内蔵プレイヤーで再生します。
typoptycatのポップアップ版です。

tycatで画像を表示した上にtypopでポップアップを表示しています。 f:id:u10e10:20161214032920p:plain

iTerm2

iTerm2でも公式サイトが配布しているスクリプトを使用することで画像が表示できるようです。
youtu.be iTerm2の2.9以降でインライン画像表示できるようになってた - uzullaがブログ

w3mimgdisplay

w3mが画像を表示できるのはw3mimgdisplayがXと通信して端末上に画像を上書きしているからです。
つまりはw3mimgdisplayさえあればX上では画像表示し放題です。

w3mimgdisplayの使い方。

echo -e '0;1;x;y;w;h;;;;;./img.png\n4;\n3;' | /usr/lib/w3m/w3mimgdisplay

f:id:u10e10:20161214032843p:plain

画像のサイズ取得もできます。
f:id:u10e10:20161214032832p:plain

入力フォーマットはImages in terminalを見てください。

結論

  • 端末共通の画像表示方法はなかった。
  • w3mimgdisplayを使えばサクッと画像表示はできる。
  • 各端末がSixelに対応すると幸せになれる。
  • terminologyオススメです。

*1:GUIのターミナルを想定

*2:有名なテキストブラウザ

*3:gnome-terminal, konsole, terminologyでは動かなかった