Elixirでテスト用の画像を量産しよう

テストデータで大量の画像を作りたいと思ったことがありました。
１枚１枚画像処理ソフトで作るのは面倒くさいので、Elixirで大量に作りたいと思います。

今回使うライブラリー

`mogrify`

https://github.com/elixir-mogrify/mogrify


## まず動作確認

iexを立ち上げる
``` sh
$ iex
```

mogrifyを使う準備

下記を打ち込んで準備します
```elixir
Mix.install([{:mogrify, "~> 0.9.2"}])
import Mogrify
```

実行例
```elixir
Erlang/OTP 25 [erts-13.0.3] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [jit:ns]

Interactive Elixir (1.13.4) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> Mix.install([{:mogrify, "~> 0.9.2"}])
:ok

iex(2)> import Mogrify
Mogrify
```

画像をつくってみよう

```Elixir
iex(6)> %Mogrify.Image{path: "hoge.png", ext: "png"} |> custom("size", "640x480") |> custom("background", "#FFFFFF") |> custom("fill", "#000000") |> custom("pango", "hogehoge") |> create(path: ".")
```

実行結果
```Elixr
%Mogrify.Image{
  animated: false,
  buffer: nil,
  dirty: %{},
  ext: "",
  format: nil,
  frame_count: 1,
  height: nil,
  operations: [],
  path: ".",
  width: nil
}

```

出力されるファイル

![hoge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/60b4c76b-60a4-5436-1cb4-02368c364935.png)

## 画像ファイルを大量に作ってみよう

プロジェクトを新規作成
コマンドラインから
```sh
$ mix new hoge
```

実行結果
```sh
* creating README.md
* creating .formatter.exs
* creating .gitignore
* creating mix.exs
* creating lib
* creating lib/hoge.ex
* creating test
* creating test/test_helper.exs
* creating test/hoge_test.exs

Your Mix project was created successfully.
You can use "mix" to compile it, test it, and more:

    cd hoge
    mix test
```

ディレクトリの移動と画像格納用のディレクトリ作成
```sh
$ cd hoge
$ mkdir img
```

mix.exsを編集
`{:mogrify, "~> 0.9.2"}` をdepsに追加

```diff_elixir:mix.exs
defmodule Hoge.MixProject do
  use Mix.Project

  def project do
    [
      app: :hoge,
      version: "0.1.0",
      elixir: "~> 1.13",
      start_permanent: Mix.env() == :prod,
      deps: deps()
    ]
  end

  # Run "mix help compile.app" to learn about applications.
  def application do
    [
      extra_applications: [:logger]
    ]
  end

  # Run "mix help deps" to learn about dependencies.
  defp deps do
    [
+     {:mogrify, "~> 0.9.2"}
      # {:dep_from_hexpm, "~> 0.3.0"},
      # {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
    ]
  end
end
```

ライブラリーを取得

```sh
$ mix deps.get
```
実行結果

```sh
Resolving Hex dependencies...
Dependency resolution completed:
Unchanged:
  mogrify 0.9.2
All dependencies are up to date
```

lib/hoge.exを編集
10枚の画像を作る関数を作成します

```diff_elixir:lib/hoge.ex
defmodule Hoge do
  import Mogrify

  @moduledoc """
  Documentation for `Hoge`.
  """

  @doc """
  Hello world.

  ## Examples

      iex> Hoge.hello()
      :world

  """
  def hello do
    :world
  end

+ def exec() do
+   1..10 |> Enum.each(&create_img/1)
+ end

+ def create_img(no) do
+   %Mogrify.Image{path: "hoge#{no}.png", ext: "png"}
+   |> custom("size", "640x480")
+   |> custom("background", "#FFFFFF")
+   |> custom("fill", "#000000")
+   |> custom("pango", "hogehoge#{no}")
+   |> create(path: "./img/")
+ end

end
```

実行してみましょう
```sh
$ iex -S mix
```

iex上で
```elixr
iex(1)> Hoge.exec()
```

実行結果
```
:ok
```

ファイル一覧してみる
```elixir
iex(5)> ls("img")
```

実行結果

```elixir
hoge1.png      hoge10.png     hoge2.png      hoge3.png      hoge4.png      hoge5.png      
hoge6.png      hoge7.png      hoge8.png      hoge9.png  
```

実際作成された画像（10枚作られる）
![hoge1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/ec07e687-3ac2-3863-2745-93ffd61b0527.png)
　　　　　　：
　　　　　　：
![hoge10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/b1ca6184-24fc-4377-6cf3-eb3929ace586.png)

画像ファイルを作ることができました