LoginSignup
16
0

More than 1 year has passed since last update.

簡単Elixirシリーズ ~ Elixir Advent Calendar の記事の合わせ技をやってみた ~

Last updated at Posted at 2022-12-17

簡単Elixirシリーズ

~ Elixir Advent Calendar の記事の合わせ技をやってみた ~

この記事は「Elixir Advent Calendar 2022」20日目の記事です
東京にいるけどfukuokaexのYOSUKEです。

簡単 Elixirシリーズでは小ネタをサクッと書いていこう。というコンセプトで作っていきます。

今回は、@mnishiguchi さんのElixirでQRコードを表示して楽しむを見て、QRコードを画像生成しようと、ErlangにあるEGD(Earling Graphical Droid)という画像ライブラリを利用して生成しようと思ったら、

@t-yamanashi さんのElixirでテスト用の画像を量産しようという記事が飛び込んできて、あれ?こっちのモジュール使った方が楽にできそうだぞ?

ということで、やってみた。という小ネタ(そう、この記事はサクッとがコンセプトW)
早速、プロジェクトファイルを作成する。

$ mix new qr_coder

まずは、QRコード生成のライブラリについて@mnishiguchiさんの記事で紹介されていた「iodevs/qr_code」がソースを見るに、SVGの書き出しまで出来そうだったので採用。
続いて、@t-yamanashi さんが紹介してくれていたmogrifyを利用します。

  defp deps do
    [
      {:qr_code, "~> 2.3.1"},
      {:mogrify, "~> 0.9.2"}
    ]
  end

で、Mogrifyの説明を見ると、 An Elixir wrapper for ImageMagick command line.
と書かれていたので、ImageMagickをインストールして、それを利用する薄いラッパーなのね。ということでインストール。

brew install imagemagick

まずは、QRコードのsvgを生成する関数を作成する

defmodule QrCoder do
  def svg(str) do
    QRCode.create(str)
    |> Result.and_then(&QRCode.Svg.save_as(&1,"#{str}.svg"))
  end
end

続いて、生成したsvgをpngに変換する関数を作成する。
今回はまず試したいので、サクッとファイル名を固定にして書き出すようにしてみた。

defmodule QrCoder do
# 省略 #
  def png(path) do
    Mogrify.open(path)
    |> format("png")
    |> save(path: "QR_code.png")
  end
end

早速、会社のURLを入れたQRコードを生成してみる。

iex()> QrCoder.svg("thewaggle-training.com")
{:ok, "thewaggle-training.com.svg"}

続いて、PNGに変換してみる。

iex()> QrCoder.png("thewaggle-training.com.svg")
%Mogrify.Image{
  animated: false,
  buffer: nil,
  dirty: %{},
  ext: ".png",
  format: "png",
  frame_count: 1,
  height: nil,
  operations: [],
  path: "QR_code.png",
  width: nil
}

お、できた。

QR_code.png

いや、Elixir の Advent Calendar で学んだことを組み合わせてみるとまた面白い発見ありますね。

皆さんも是非、チャレンジしてみてください。

16
0
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
16
0