Go言語でコマンドプロンプトに画像を表示するコマンドを作って、Vimの:terminalで表示させた
おはようございます。保育参観後、次男は熱を出し、また、長期化して、実家暮らしかもと冷や冷やしましたが、すぐに回復して、長男の誕生日イベントに奥さんと映画に行ってこれました。@kjunichiです。
背景
ANSIエスケープで端末に画像を表示するものは多く出回っていて、自分もmacOS上ではnode.js実装のansi-canvasのexampleのimgcatを 愛用している。
しかし、事前準備なしでWindowsのコマンドプロンプトに表示するものはなかなか見つからなかった。コマンドプロンプトにも一部の文字に 色を付けて表示することは可能なので、色数は限定されそうだが、原理的には出来なくなさそうだった。が、 Windowsの直接のAPIだと、Windowsでの開発歴が浅い自分には、難易度が高かった、ANSIエスケープ並みの手軽なAPIで これを実現するものがないものかと、物色していたところ、termbox-goなるライブラリを知った。
試行錯誤
8色しか出せなそう?
多分、vimの:terninalって訳ではなく、windowsだと、256色表示に対応出来ないのかも https://t.co/JxnJTW3fmk pic.twitter.com/fJOPPxMJKt
— kjunichi (@kjunichi) 2017年8月11日
16色行けそう
vimの:ternimalモードを試して、termbox-goでアトリビュートの値で512位足すと明るい色が使えそうと言う知見を得たのが今年の夏休みの唯一の成果とならないように、自由時間を満喫したいでも、ガンダムオリジン見始めてしまいヤバみ
— kjunichi (@kjunichi) 2017年8月12日
GoのImageの内部のピクセル値は最大65535だった
このツイートのように、termbox-goで任意の場所に色を出せるようになったものの、JPEGファイルをGoで処理して画素値を取得して、 termbox-goでの色に割り当てようとして、なかなか画素値が最大255という思い込みがあり、上手くできないでいた。
コマンドプロンプトに8色しかないないとはいえ、全然、真っ白な画像だったりで、ダメだなぁと諦めかけていたが、golangのColor型のRGBAの戻り値が最大65535なのしってようやく、なにか出せる気がしてきたw pic.twitter.com/BOMibPZbXs
— kjunichi (@kjunichi) 2017年8月13日
インパクトがある画像が功を奏して、湘南新宿ラインの炎上ツイート以来のリツーイト数を獲得できた。
Vimの:terminalは発展中
vimの:terminalだと白がだせないっぽい。。 pic.twitter.com/rqNuofXUIO
— kjunichi (@kjunichi) 2017年8月13日
と、ツイートしてしまい、Vim界の大物であり、ツイートからSIer所属でお子さんもおり、自分と境遇が近く、勝手に親近感もってる@mattn_jpさんから
コード欲しいです!
— Vim界の声の大きい人 (@mattn_jp) 2017年8月13日
と返信あり、速攻でGistに張り付け、
ちょっと色の変換がツイート時のときと変わってますが、こちらです。(大変汚いソースで済みません。) https://t.co/uaXXr8xKSH
— kjunichi (@kjunichi) 2017年8月13日
返信したところ、すぐに確認して頂き、
最新版の vim/gvim だと白表示されてそうでした。 pic.twitter.com/jjhxLIxdlA
— Vim界の声の大きい人 (@mattn_jp) 2017年8月13日
とご回答頂き、自分のところのソースが古かったので、最新のVimでは白も無事表示されました。@mattn_jpさんありがとうございました!
成果物
初期公開時ではJPEGファイルのみだったが、今はURLにも対応して、PNGかJPEGなら表示出来る ようになった。