はじめに
皆さんは SVG を PNG に変換したいときどうしていますか?
Google で検索すると大量にオンライン変換ツールが出てきます
でも、オンラインには上げられない、もしくは怪しいサイトにはアクセスしたくない、ということもありますよね
Elixir なら手元で変換可能です!
というわけで、今回は Image モジュールで SVG を PNG に変換するだけの小ネタです
いつものように Livebook を使います
実装したノートブックはこちら
実行環境
- Elixir: 1.14.2 OTP 24
- Livebook: 0.9.3
以下のリポジトリーの Docker コンテナ上で起動しています
Docker が使える環境であれば簡単に実行できます
https://docs.docker.com/engine/install/
Docker Desktop を無償利用できない場合は Rancher Desktop を使ってください
セットアップ
必要なモジュールをインストールします
Mix.install([
{:image, "~> 0.35"},
{:req, "~> 0.3"},
{:kino, "~> 0.9"}
])
Req はモデルファイルや画像を Web からダウンロードするのに使っています
SVG のダウンロード
元画像には ElixirConf EU のヘッダーに使われているアイコンを使ってみます
元画像(SVG)
SVG の画像を Web からダウンロードします
svg_img =
"https://www.elixirconf.eu/assets/images/drops.svg"
|> Req.get!()
|> then(& &1.body)
|> Image.from_svg!()
実はこの時点で Livebook に表示された画像を右クリック |> 保存で PNG として保存可能です
PNG 形式で保存
せっかくなので、コードでも保存しましょう
Image.write(svg_img, "png_img.png")
実行結果は以下のようになります
{:ok, %Vix.Vips.Image{ref: #Reference<0.795797202.1408368656.27075>}}
Image モジュールは内部的に Vix というモジュールを利用していて、その画像形式が返っています
ファイルを確認すると、確かに PNG 形式になっています
まとめ
SVG を扱えるのは何気に便利です