LoginSignup
9
1

Elixirでアスキーアートしたい

Last updated at Posted at 2021-12-24

先日Nerves電子ペーパーでHello worldに取り組んで、文字列をピクセルに変換するテクニックを学んだので、メモしておこうとおもいます。

IExでデモ

# 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

%   %                               %   %
%   %                               %   %
%% %%                                % %
% % %  %%%  % %%  % %%  %   %        % %  %% %   %%%   %%%
% % % %   % %%  % %%  % %   %         %   % % %     % %   %
%   % %%%%% %     %     %   %        % %  % % %  %%%%  %%
%   % %     %     %     %  %%        % %  % % % %   %    %
%   % %   % %     %      %% %       %   % % % % %  %% %   %
%   %  %%%  %     %         %       %   % %   %  %% %  %%%
                        %   %
                         %%%

:tada::tada::tada:

もっと本格的なアスキーアートについて田代さん(@sotashiro)が知見を共有してくださってます。

:tada::tada::tada:

9
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
1