This is IT

技術、日常

ActiveStorageを用いたファイルのアップロード・サムネイル生成の、各種gem・ライブラリを理解する

はじめに

現在通っているスクールの課題で、「ActiveStorageを用いて、ファイルのアップロード機能・サムネイル生成機能を作る」に取り組んでいます。

ActiveStorage単体だけではなく、Image_processingやmini_magick、ImageMagick、libvipsなどなど様々なライブラリやgemが存在し、大分頭がこんがらがってしまったので、一度整理をしておきます。

結論

  • ActiveStorage
    • アップロードや、ActiveRecortオブジェクトとの紐づけ。 画像処理は行えない。
  • ImageMagickとlibvips
  • ImageProcessing
    • ImageMagick・libvipsを用いた画像処理用のヘルパーメソッドを提供。MiniMagickと、RubyVipsも内包している高レベルのgem。
  • MiniMagickとRubyVips
    • ImageProcessingに内包されている。ImageProcessingで抽象化しきれなかった、各ツール(ImageMagick・libvips)の画像処理のヘルパーメソッドを提供。

ActiveStorageについて

ActiveStorageは、ストレージサービスへのファイルアップロードや、ActiveRecordオブジェクトとの紐づけを主としています。

Active Storageは、Amazon S3Google Cloud Storage、Microsoft Azure Storageなどのクラウドストレージサービスへのファイルのアップロードや、ファイルをActive Recordオブジェクトにアタッチする機能を提供します。

また、このフレームワーク自体では、画像のリサイズや各種画像処理を行うことはできません。

画像分析や画像加工のためにimage_processing gemも必要です。

Active Storage の概要

そのため、ActiveStorageを用いて画像をアップロードした後に、画像のリサイズなどの処理を行うには、各種gemやライブラリのインストールが必要となります。

ImageMagickとlibvipsについて

どちらも、コマンドラインから画像処理を行えるツールとなっています。

例えば、ImageMagickを用いて、「カレントディレクトリにあるPNGJPEGのファイルから100×100ドットのPNG形式のサムネイル画像を作ってファイル名の先頭をThumb-にする」といった処理ならば、以下のように記述をする必要があります。

magick *.png *.jpg -set filename:x "Thumb-%t" -thumbnail "100x100" "%[filename:x].png"


また、libvipsは、ImageMagickと用途は同じですが、ImageMagickに比べ、高速化・メモリ消費減を実現しているツールとなります。 画像処理を行いたい場合は、どちらかのツール(ライブラリ)のインストールが必須となります。

コマンドラインで画像処理が行える便利ツール「ImageMagick」

Active Storage の要件

ImageProcessingについて

ImageProcessingは、画像処理において必要な、高レベルな画像処理ヘルパーを提供してくれます。

ImageMagickや、libvips単体で用いた場合、画像処理に複雑なコードを自身で記述する必要がありますが、image_processingを用いることで画像処理ヘルパーが利用できるので、より簡易に処理コードを記述することができます。

また、このgemは、mini_magick・ruby-vips gemをそれぞれ内包しています。 image_processing gemをインストール後、Gemfile.lockを確認してみると、内包していることを確認できます。

image_processing Railsの画像まわりのライブラリについて整理する

MiniMagickとRubyVipsについて

上述の通り、それぞれimage_processing gemに内包されています。 それぞれ名前の通り、mini_magickはImageMagick用、ruby-vipsはlibvips用のヘルパーメソッドを用意してくれています。

例えば、画像サムネイルを表示させるviewファイルを作成する場合、app/views/users/show.html.erb内のコードは下記のようになります。

<p>
  <strong>Portrait:</strong>

  <%= image_tag @user.portrait.variant(メソッド) %>
</p>

ここでvariantメソッドの引数として渡したメソッドは、ImageProcessingライブラリ(高レベル)にメソッドが存在していれば、ImageProcessingのメソッドとして、存在しなければ、低レベルのMiniMagick、または、RubyVipsのメソッドとして実行されます。

ImageProcessing::MiniMagick ImageProcessing::Vips

パーフェクト Ruby on Rails 【増補改訂版】 (Perfect series)

処理の流れ

最後のまとめとして流れを記しておきます。

  1. ActiveRecordの機能を用いて、ファイルのアップロード
  2. ImageProcessingのヘルパーメソッドを用いて、画像の処理命令をImageMagick(libvips)に出す。
  3. ImageProcessingで包括しきれていない画像処理だった場合は、MiniMagick(RubyVips)が提供しているメソッドを利用して、処理命令を出す。
  4. ImageMagick(libvips)が実際に画像を処理