特に理由もなく一年以上放置していましたが、特に理由もなく再開します。
最近、仮想端末をiTerm2にしたので、xterm-256使えるぞと思って色々遊んでいました。(*OSX標準のターミナルもいつの間にかxterm-256対応していた)
Unicodeには点字を表現するための文字群があり、2x3の点字64種類とそれを含む2x4の点字256種類で構成されています。 これはUnicode中で自由に制御できる最も解像度の高い文字群ではないかと思い、xterm-256と合わせて利用してみることにしました。
# ちなみにこんなのです
⠁⠂⠃⠄⠅⠆⠇⠈⠉⠊⠋⠌⠍⠎⠏⠐⠑⠒⠓⠔⠕⠖⠗⠘⠙⠚⠛⠜⠝⠞⠟⠠⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠫⠬⠭⠮⠯⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻⠼⠽⠾⠿
Step 1
まずは点字のみで、二値画像を表現してみます。 ちょうど新しい職場でPythonを使い始める時期だったのでPythonで、二値画像としては手頃なマンデルブロ集合を使います。
ポイントはWikipediaにもありますが、2x3の点字が最初のほうに固まっているので、ビットを入れ替える必要があるところとマンデルブロの綴りくらいでしょうか。
Step 2
Pythonにも慣れてきたので次はいよいよxterm-256を使いますが、いきなりカラーは難しそうなのでグレイスケールを使います。
The 256 color mode of xtermによれば、xterm-256はシステムカラー16色、6階調RGBの216色、グレイスケール24段階の計256色で構成されており、 以下のシーケンスで前景色、背景色が指定できます。(ここだけRubyです)
print "\e[38;5;#{color}m" # 前景色
print "\e[48;5;#{color}m" # 背景色
# グラデーションがでます
$ ruby -e '24.times{|i|print"\e[48;5;#{232+i}m "};puts'
そうしてできあがったのが以下のコードです。
基本的には、切り出された2x4pixelsに対して最も暗い色と明るい色を前景色/背景色に選び、各pixelをどちらかに振り分けるだけなんですが、
- 誤差拡散法
- なるべく前景色/背景色が同じにならないようにする
- ガンマ調整(のようなもの)
といった工夫によりかなり画質を向上させています。 興味のある方はコードを弄って、どれくらい画質に影響を与えているか見てみると楽しいかもしれません。
Step 3
カラー対応といいたい所ですが、3次元から1次元へ削減を行わないといけなかったり、人間の色覚モデルを考慮するのが面倒そうだったりしてまだやってないです。