phel-lang でアスキーアート作成ツールを作成しました
2024/11/18
Phel-langで何かを作ってみようと考えていて、アスキーアートを作成するツールを作ってみました。

下のような文字を出力します。
あんまり綺麗じゃないけど、目を細めると php の文字が見えます。
最初からどう作ればいいかわかっていた訳ではないけど、実験しながら作ってみたという感じです。
作ってる時に考えてた事
- 超簡略化した全体的な方針としては、画像の一部分を読んで、文字表現に変換して表示すれば良い。
- 事前に比較対象となる全アスキー文字を、ベクトル表現に変換しておく。
- 引数に指定された画像をセルに分割して、セル毎にベクトル表現に変換する。
- セルのベクトル表現に一番似ているベクトル表現の文字に置き換えて出力する。
事前準備
各文字(例えばA
)に該当する小さい画像を用意しました。ベクトル表現にするのに全ての点をチェックする訳にもいかないので、一定間隔でサンプリングしたポイントの色を調べてベクトル表現を作ります。1文字を縦横5分割して、25個の点の色の濃さを表現する値を1次元配列にしたものをベクトル値としました。一定間隔でサンプリングする都合上画像は事前にぼかしを加えてます。サンプリングした時に文字の特徴をとらえやすくなると考えたためです。
例えば、Aの場合は、65.json
としてベクトル表現を保存しました。
{"char":"A","hist":[249,248,239,238,251,233,119,74,219,251,239,156,82,206,251,250,249,246,245,251,254,253,252,252,252]}
画像の読み込み
引数に指定されたパスの画像を、セルに分割してセルを縦横5分割して25の色の濃さからベクトル表現を作成します。これと事前準備した各文字のベクトル表現と比較して一番似ている文字を出力するようにしました。
「似ている」ものを探すというのは地味に大変な作業というか、正確に判定しようとすると難しい作業になりますが、今回は非常に簡単に、ベクトル表現をJSON文字列に変換後、PHPの標準関数 levenshtein関数を使って、JSON文字列の距離が近ければ似ていると判定しました。
このような簡単な実装ですが、一応アスキーアートらしきものを出力できました。改善可能な箇所はたくさんありますが、一旦終了とします。