要約

SSHでサーバーを触っているときに、サクっと画像を確認したいときがある。

ターミナルで画像を表示するためのプロトコルは、 普段使いしているコマンドプロンプトでは使用できないため、 を使って画像を表示した。

画面例


このソフトウェアは以下の機能を持っている。

  • ANSIエスケープシーケンスで画像を表示する
  • 画像の拡大・縮小
  • 視点移動
  • 透過画像の表示
  • 画面サイズに応じて画像を表示

半透明の画像も表示できる。 画面例(透過)

ターミナルで画像を表示するプロトコル

ターミナルで画像を表示したい」という要望はあるようで、画像を表示プロトコルが存在していることが分かっている。

しかし、Windowsのコマンドプロンプトでは SixelInline Images Protocolも使えないので、別の方法を考える必要がある。

なぜコマンドプロンプト

WezTermのようなターミナルを使用すれば、Sixelなどのプロトコルを利用できるのに、頑なにコマンドプロンプトを使い続けるのには理由がある。

単純に、設定しなくても使いやすいからである。

cmd コマンド

Windowsエクスプローラーでは、ファイルパスが表示されている部分でコマンドを実行することができる。 エクスプローラーでコマンドを実行

この部分で cmd を実行すると、コマンドプロンプトで現在のフォルダを開くことができるのだ。
いちいち cd で移動する必要が無く、即座に作業に移行できる。
特にWindowsでは、cd/d を使うべき場面があるため、これを回避できるのも大きい。

Weztermで同じことをやろうと思うと、
パスを通したり、エイリアスを設定したりする必要があるので面倒だ。

フォントが良い

初期設定でこの丸っこいフォントが使われているのが良い。
(Cascadia Monoというフォントのようだ。)

コマンドプロンプトの画面例

また, デフォルトの配色も彩度が高くて見やすい。
以下のShellスクリプトを実行した結果を比べてみる。

1
2
3
4
echo;
for ((i=40; i<=47; i++)) do printf '%d ' $i; done; echo;
for ((i=40; i<=47; i++)) do printf '\e[%dm  \e[m ' $i; done; echo;
echo;

まず、コマンドプロンプトの配色。色が濃くて見やすい。 コマンドプロンプトの配色

次に、Weztermの配色。比べると少し淡い色だ。 Weztermの配色 特に、Weztermの白(47)はグレーに寄っていて、文字が読みにくい印象がある。

Weztermはホームディレクトリの .wezterm.lua を使って設定を行えるため、
以下のような設定を行った。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
local wezterm = require 'wezterm'
local config = {}

if wezterm.config_builder then
  config = wezterm.config_builder()
end

-- フォントの設定
config.font = wezterm.font("Cascadia Mono", {weight="Medium", stretch="Normal", style="Normal"})
config.font_size = 12

-- テーマ
config.color_scheme = 'Abernathy'

return config


この設定で配色をチェックしてみると、だいぶ見やすくなった。 Weztermの配色(改良版)


Weztermでは、設定ファイルをホームディレクトリに置くと設定を反映させることができるが、
設定しなくても見やすいコマンドプロンプトには勝てない。


以上の理由でコマンドプロンプトを使いたいため、
コマンドプロンプトでも画像が見れるようなソフトを作成した。

車輪の再発明

ターミナルで画像を表示するために、ANSIエスケープを用いて画像を表す方法がいくつか存在する。
今回は (U+2580) を使用して画像を描画する。

文字色と背景色を設定して を描画すると、縦2ピクセルを描画することができる。
これを用いて画像を表示していく。

・・・

ここで大きな誤算があった。

調べる限り、この方法で画像を表示している人は居らず、
独自性があると考えていたのだが、chafa というプログラムが存在していた。

しかも、chafa ではGIFアニメーションを再生することができる。
(プログラムを書く前に知りたかった…)

ただ、 透過画像の表示や画像の拡大などの要素は chafa に実装されてなさそうなので、
差別化はできていた。 (よかった)

インストーラーの作成

昔から、 make install でインストールできるソフトウェアに憧れていたので、
今回は make を用いたインストーラーを作成した。

というか、Geminiに書いてもらった。

Geminiの出力をそのままコピペすると、
Ubuntu上でコマンドをインストールできるようになった。(生成AIに感謝)

プログラム

初めてRustに挑戦したので、所有権関連の実装に手間取ったが、少しずつ慣れていきたい。

ソースコード: GitHub