エスケープシーケンスで色のついた文字列をそのまま再現した画像を出力するコマンドtextimgを作った
サンプル
code:bash
screenfetch | textimg -o /images/t.png #シェル芸 https://gyazo.com/6e25d3fb1ad8a25d009fb26688dbb914
code:bash
seq 0 255 | while read i; do
echo -ne "\x1b[38;2;${i};0;0m$(printf %03d $i)"
echo
fi
done | textimg -o extrgb_f_gradation_red.png
このシェルから以下の画像が生成される
https://gyazo.com/c4a89ffe60b40ff96e2cd93624aeac82
アニメーションGIFも作れる
https://gyazo.com/ae4a53c5cf99e79153177c430aa494e3
作った経緯
シェル芸bot環境で色のついたテキストから画像を表示できるようにしたかった super_unkoリポジトリに存在するエスケープシーケンスで画像を再現するbigunko.showというコマンドをシェル芸bot環境から閲覧できるようにしたかった 実装
エスケープシーケンスを含む文字列は以下のように分解・分類できる
例:\x1b[1;31;42mRed foreground Green background\x[0mNormal
分解後:
1 太字にする (文字装飾)
31 文字色を赤にする (色変更)
42 背景色を緑にする(色変更)
Red foreground Green background (文字列)
0 文字の装飾や色変更をもとに戻す (色変更)
Normal (文字列)
このように文字列をエスケープシーケンスか、テキストかに分解し、エスケープシーケンスの中から着色に関係のある文字列か否かに分類するようにしている
エスケープシーケンスとのマッチはそれぞれ以下の正規表現で取り出している 色系:^\x1b\[[\d;]*m
色系以外:^\x1b\[\d*[A-HfSTJK]
画像描画では、文字列が来たときだけ画像変数にテキストを書き込み、それ以外の場合は書き込むテキストに指定する色や装飾の変更だけを行うのをひたすら繰り返すようにしている