19
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ElixirAdvent Calendar 2022

Day 17

Elixir Livebook 0.8.0 の新機能 Kino.Input.image の画像入力が便利!

Last updated at Posted at 2022-12-09

はじめに

Livebook 0.8.0 がリリースされました :rocket:

その中の新機能 Kino.Input.image で、画像をローカルから簡単にアップロードできるようになりました!

セットアップ

Kino の 0.8 と、画像表示などのために Nx 、 Evision をインストールします

Mix.install([
  {:nx, "~> 0.4"},
  {:evision, "~> 0.1"},
  {:kino, "~> 0.8"}
])

画像選択

Kino.Input.image を実行すると、画像アップロード用の入力エリアが表示されます

image_input = Kino.Input.image("IMAGE")

image.gif

画像をドラッグ&ドロップ、もしくは入力エリアをクリックしてファイル選択すると、選択した画像が出力結果に表示されます

画像表示

選択した画像を取得してみます

image = Kino.Input.read(image_input)

スクリーンショット 2022-12-09 17.13.22.png

デフォルトだとこのように :rgb の形式で取得されます

この場合、 data を以下のようにマトリックスに変換すれば画像として表示できます

image.data
|> Nx.from_binary(:u8)
|> Nx.reshape({image.height, image.width, 3})
|> Evision.Mat.from_nx_2d()
# Evision では BGR なので変換する
|> Evision.cvtColor(Evision.Constant.cv_COLOR_RGB2BGR())

スクリーンショット 2022-12-09 17.15.00.png

Evision を使わず、テンソルのまま Kino.Image.new に入れる方法もあります

image.data
|> Nx.from_binary(:u8)
|> Nx.reshape({image.height, image.width, 3})
|> Kino.Image.new()

スクリーンショット 2022-12-09 17.16.47.png

PNG指定

フォーマットを PNG に指定することもできます

image_input = Kino.Input.image("IMAGE", format: :png)

その場合、データは以下のようになります

image = Kino.Input.read(image_input)

スクリーンショット 2022-12-09 17.18.56.png

Evision で使う場合はこっちの方が扱いやすいです

image.data
|> Evision.imdecode(Evision.Constant.cv_IMREAD_COLOR())

スクリーンショット 2022-12-09 17.20.18.png

JPEG指定

JPEG指定もできます

image_input = Kino.Input.image("IMAGE", format: :jpeg)

この場合も Evision のマトリックスには変換しやすいですね

image_input
|> Kino.Input.read()
|> then(&(&1.data))
|> Evision.imdecode(Evision.Constant.cv_IMREAD_COLOR())

リサイズ

指定したサイズにリサイズできます

fit: :contain を指定した場合、指定したサイズに収まるように縦横比を保持したままリサイズします

image_input = Kino.Input.image("IMAGE", format: :png, size: {200, 500}, fit: :contain)

スクリーンショット 2022-12-09 17.26.37.png

fit: :match を指定した場合、指定したサイズになるよう、縦横比を変えてリサイズします

image_input = Kino.Input.image("IMAGE", format: :png, size: {200, 500}, fit: :match)

スクリーンショット 2022-12-09 17.28.14.png

fit: :pad を指定した場合、指定したサイズになるよう、余白に黒を詰めます

image_input = Kino.Input.image("IMAGE", format: :png, size: {200, 500}, fit: :pad)

スクリーンショット 2022-12-09 17.29.44.png

fit: :crop を指定した場合、指定したサイズになるよう、はみ出したところを切り捨てます

image_input = Kino.Input.image("IMAGE", format: :png, size: {200, 500}, fit: :crop)

スクリーンショット 2022-12-09 17.31.05.png

ダウンロード

Kino.Download.new を使えば、リサイズした画像をそのままダウンロードすることもできます

Kino.Download.new(fn ->
  image_input
  |> Kino.Input.read()
  |> then(&(&1.data))
end,
filename: "resized.png")

スクリーンショット 2022-12-09 17.43.18.png

まとめ

これでローカルの好きなファイルを好きに加工できますね

19
3
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
19
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?