先日Nerves電子ペーパーでHello worldに取り組んで、文字列をピクセルに変換するテクニックを学んだので、メモしておこうとおもいます。
IExでデモ
- フォントはolikraus/u8g2からダウンロード。
- BDFフォントしかつかえない様子。
- luisgabrielroldan/chiselを用いてビットマップフォント処理。
# IExを起動。
iex
# 最低限の依存関係をインストール。
Mix.install([:chisel, :httpoison])
# BDFフォントをダウンロード。
font_name = "6x13"
font_url = "https://raw.githubusercontent.com/olikraus/u8g2/master/tools/font/bdf/#{font_name}.bdf"
{:ok, %{body: font_data, status_code: 200}} = HTTPoison.get(font_url)
# フォントデータの一時ファイルを作成。
# ファイル拡張子は`.bdf`である必要があるようです。
font_file = Path.join(System.tmp_dir!(), "#{font_name}.bdf")
# 一時ファイルにフォントデータを書き込む。
File.write!(font_file, font_data)
# Chiselが一時ファイルからフォントデータを読み込み、解析する。
{:ok, chisel_font} = Chisel.Font.load(font_file)
# 文字列を座標リストに変換。
{pixels, _, _} = Chisel.Renderer.reduce_draw_text(
"Merry Xmas",
0,
0,
chisel_font,
[],
fn x, y, pixels -> [{x, y} | pixels] end
)
# 座標リストを利用して各ピクセルをプリントする。
for y <- 0..16 do
for x <- 0..96 do
if Enum.member?(pixels, {x, y}) do
"%"
else
" "
end
end
|> IO.puts()
end
% % % %
% % % %
%% %% % %
% % % %%% % %% % %% % % % % %% % %%% %%%
% % % % % %% % %% % % % % % % % % % %
% % %%%%% % % % % % % % % % %%%% %%
% % % % % % %% % % % % % % % %
% % % % % % %% % % % % % % % %% % %
% % %%% % % % % % % % %% % %%%
% %
%%%
もっと本格的なアスキーアートについて田代さん(@sotashiro)が知見を共有してくださってます。