はじめに
現在通っているスクールの課題で、「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 S3、Google Cloud Storage、Microsoft Azure Storageなどのクラウドストレージサービスへのファイルのアップロードや、ファイルをActive Recordオブジェクトにアタッチする機能を提供します。
また、このフレームワーク自体では、画像のリサイズや各種画像処理を行うことはできません。
画像分析や画像加工のためにimage_processing gemも必要です。
そのため、ActiveStorageを用いて画像をアップロードした後に、画像のリサイズなどの処理を行うには、各種gemやライブラリのインストールが必要となります。
ImageMagickとlibvipsについて
どちらも、コマンドラインから画像処理を行えるツールとなっています。
例えば、ImageMagickを用いて、「カレントディレクトリにあるPNGやJPEGのファイルから100×100ドットのPNG形式のサムネイル画像を作ってファイル名の先頭をThumb-にする」といった処理ならば、以下のように記述をする必要があります。
magick *.png *.jpg -set filename:x "Thumb-%t" -thumbnail "100x100" "%[filename:x].png"
また、libvipsは、ImageMagickと用途は同じですが、ImageMagickに比べ、高速化・メモリ消費減を実現しているツールとなります。 画像処理を行いたい場合は、どちらかのツール(ライブラリ)のインストールが必須となります。
コマンドラインで画像処理が行える便利ツール「ImageMagick」
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)
処理の流れ
最後のまとめとして流れを記しておきます。
- ActiveRecordの機能を用いて、ファイルのアップロード
- ImageProcessingのヘルパーメソッドを用いて、画像の処理命令をImageMagick(libvips)に出す。
- ImageProcessingで包括しきれていない画像処理だった場合は、MiniMagick(RubyVips)が提供しているメソッドを利用して、処理命令を出す。
- ImageMagick(libvips)が実際に画像を処理