ターミナル上に画像を表示する方法いろいろ
ターミナル*1に画像表示したいですよね。
先日w3m*2でブラウジングしてたら、テキストブラウザなのに画像が表示されて驚きました。
gnome-terminal, konsole, terminologyの3つの端末で表示されたので端末共通の画像表示方法がありそうです。
端末上での画像表示について調べたこと書きます。
(結論を言うと、端末に共通の表示方法はなかった)
この記事はKogakuin Univ Advent Calendar 2016 - Adventarの13日目です。
目次
- 目次
- 比較元画像
- アスキーアート
- エスケープシーケンス
- pxl
- DRCS(Soft Character Set)
- Sixel
- terminology
- iTerm2
- w3m(w3mimgdisplay)
- 結論
比較元画像
この画像が飽きるほど出てきますが、我慢してください。
※なにかを頑張ったわけではありません。
アスキーアート
「端末に画像」と聞いて最初に思いつくのはアスキーアートだと思います。
画像をAA化するサイト
を使用してフォントサイズ7で出力しました。
エスケープシーケンス
ターミナルでもエスケープシーケンスを使えば色付き文字を出力できます。
エスケープシーケンスについて詳しくは下記。
エスケープシーケンスを体感する - ザリガニが見ていた...。
画像表示
下記のスクリプトを使用
ターミナルに画像を表示する - Qiita
フォントサイズ12(普段)
フォントサイズ5(使用中端末の最小値)
改良版
「ターミナルに画像を表示する」の画質向上を試みる - Qiita
フォントサイズ12
フォントサイズ5
pxl
最近Go製のCLIツールをよく目にします。
pxlはターミナルに画像を表示するGo製ツールです。
go get github.com/ichinaski/pxl pxl img.png
GitHub - ichinaski/pxl: Display images in the terminal
フォントサイズ12
フォントサイズ5
縦に潰れてますが、かなり鮮明です。
※pxlは今までのものと違い仮想画面に描画しています。
DRCS(Soft Character Set)
平たく言うと画像をフォントとして扱う端末機能ですが対応端末は少ないです。
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
非対応端末
文字が沢山出る
xterm -ti 340
色がおかしい(パッチを当てないと?)
mlterm
おぉ 見事に画像が表示されました!
対応端末が増えると良いですね。
参考資料
長編まとめ・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にサムネイルが付きます。
tycat
は引数のファイル(画像、音楽、動画)を内蔵プレイヤーで再生します。
typop
はtycat
のポップアップ版です。
tycat
で画像を表示した上にtypop
でポップアップを表示しています。
iTerm2
iTerm2でも公式サイトが配布しているスクリプトを使用することで画像が表示できるようです。
youtu.be
iTerm2の2.9以降でインライン画像表示できるようになってた - uzullaがブログ
w3m(w3mimgdisplay)
w3m
が画像を表示できるのはw3mimgdisplay
がXと通信して、端末上に画像を上書きしているからです。
つまりはw3mimgdisplay
さえあればX上では画像表示し放題です。
w3mimgdisplay
の使い方。
# x y w h と ./img.png を適切に指定する echo -e '0;1;x;y;w;h;;;;;./img.png\n4;\n3;' | /usr/lib/w3m/w3mimgdisplay
画像のサイズ取得もできます。
入力フォーマットの詳細はImages in terminalを見てください。
結論
- 端末共通の画像表示方法はなかった。
- w3mimgdisplayを使えばサクッと画像表示はできる。
- 各端末がSixelに対応すると幸せになれる。
- terminologyオススメです。