ソース全文
Gist - display image in Terminal
※高度な技術は持ち合わせてないので期待しないでください。
元ネタ
1: サイズ変更のメソッドを「resize」にする
ただ、sampleのほうがクッキリしてる感じもします。
resizeかsampleかは好みの問題なので「-s」オプションを付ければsampleメソッドを使うようにしました。
2: 1ピクセルを行でなく列に合わせる
等幅フォント前提ですが、ターミナルの1行の高さはだいたい2文字の幅と同じです。
1ピクセルを1文字で表示するか2文字で表示することになります。
2文字のほうが手軽ですが、1文字にすると横の解像度が倍になります。
3: 色の幅が狭い場合はモノクロにする
変な色が減ったりモノクロ部分が引き締まったりするといいなぁ思います。
ここまでの画像では全てこの処理をやってます。
肌色に見えますが、顔の部分は灰色です。
ANSIカラーについてはここを読めばよく分かります。まじおすすめ。
→ エスケープシーケンスを体感する - ザリガニが見ていた...。
ANSIカラーについて必要なことだけ説明
\e[48:5:XXXm
のXXXの数値によって文字列の背景色を変更できます。
変更を解除しなければその後の文字もずっと色が変わったままになるので\e[m
で解除します。
表示可能な色は256種類あります。
XXXの値 | 色数 | 説明 |
---|---|---|
0〜15 | 16色 | 基本の16色 |
16〜231 | 216色 | RGBそれぞれ6階調の666=216色 |
232〜255 | 24色 | グレイスケール |
となってます。
基本の16色、というのはこれの「ANSIカラー」のことです。(たぶん)
例えば#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」にする
チート。
めちゃくちゃ重いです。
実用性は皆無です。
※スクリプトには含めてません。手動です。
以上です。
追記: あえて背景色じゃなくて文字色だけ変える
(結局ターミナルじゃ1文字分よりも解像度を上げることはできないので、表示しない空間をあえて増やすことにより人類の脳内補完による画質向上を期待)