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

  • 15
    Like
  • 0
    Comment
More than 1 year has passed since last update.

ソース全文

Gist - display image in Terminal

※高度な技術は持ち合わせてないので期待しないでください。

元ネタ

ターミナルに画像を表示する

1: サイズ変更のメソッドを「resize」にする

before: (sampleメソッド使用)
スクリーンショット 2015-09-19 17.31.19.png

after: (resizeメソッド使用)
スクリーンショット 2015-09-19 17.31.24.png

ただ、sampleのほうがクッキリしてる感じもします。
resizeかsampleかは好みの問題なので「-s」オプションを付ければsampleメソッドを使うようにしました。

2: 1ピクセルを行でなく列に合わせる

after: (1ピクセル = 1列)
スクリーンショット 2015-09-19 17.31.50.png

等幅フォント前提ですが、ターミナルの1行の高さはだいたい2文字の幅と同じです。
1ピクセルを1文字で表示するか2文字で表示することになります。
2文字のほうが手軽ですが、1文字にすると横の解像度が倍になります。

3: 色の幅が狭い場合はモノクロにする

変な色が減ったりモノクロ部分が引き締まったりするといいなぁ思います。
ここまでの画像では全てこの処理をやってます。

before: スクリーンショット 2015-09-19 17.32.14.png

after: スクリーンショット 2015-09-19 17.31.50.png

肌色に見えますが、顔の部分は灰色です。

ANSIカラーについてはここを読めばよく分かります。まじおすすめ。
エスケープシーケンスを体感する - ザリガニが見ていた...。

ANSIカラーについて必要なことだけ説明

\e[48:5:XXXmのXXXの数値によって文字列の背景色を変更できます。
変更を解除しなければその後の文字もずっと色が変わったままになるので\e[mで解除します。

表示可能な色は256種類あります。

XXXの値 色数 説明
0〜15 16色 基本の16色
16〜231 216色 RGBそれぞれ6階調の6*6*6=216色
232〜255 24色 グレイスケール

となってます。
基本の16色、というのはこれの「ANSIカラー」のことです。(たぶん)
3c5c7bdd-b2d1-ee69-24e5-90dec0aa5c01.jpg

例えば#AABBCCという色の近似色を探したい場合はこんな感じで変換します。

color = "#AABBCC"

# 赤緑青それぞれを16進数から10進数にする
rgb = color.scan(/[0-9a-f]{2}/i).map{|c| c.to_i(16) }
#=> [170, 187, 204]

# 256階調を 0〜5 の6階調にする
rgb_base6 = rgb.map{|c| (c / 255r * 5).round }
#=> [3, 4, 4]

# 結合して6進数として扱い、10進数にして基本色の数16を足す
xxx = rgb_base6.join.to_i(6) + 16
#=> 152

# 表示
puts "あいうえお \e[48;5;#{xxx}m かきくけこ \e[m さしすせそ"

で、RGBがそれぞれたった6階調なので、変な色になったりします。
RGB3色の差が狭い場合はグレイスケールの24階調にすればすこし改善します。
白黒の表現の幅も少し広がります。

4: フォントサイズを「1」にする

チート。

after: (フォントサイズ 1)
スクリーンショット 2015-09-19 17.33.28.png

めちゃくちゃ重いです。
実用性は皆無です。
※スクリプトには含めてません。手動です。

以上です。

追記: あえて背景色じゃなくて文字色だけ変える

aaa.png

(結局ターミナルじゃ1文字分よりも解像度を上げることはできないので、表示しない空間をあえて増やすことにより人類の脳内補完による画質向上を期待)

参考