画像の自動リサイズ処理が必要な理由
ファイルサイズに対するバリデーションは、Railsチュートリアル 第13章 ユーザーのマイクロポスト - 画像の検証で実装できました。しかしながら、画像サイズ(縦横の長さ)に対する制限は、現状では存在しません。そのため、大きすぎる画像サイズ(横2048ピクセル等)のファイルがアップロードされると、以下のようにレイアウトが壊れてしまいます。

ImageMagickのセットアップ
Railsチュートリアルを進めていっている開発環境においては、ImageMagickは必ずしもインストールされているとはいえません。また、ImageMagickそのものはgemというわけではないので、Bundlerによる管理の対象とはならず、個々の環境で別途インストールする必要があります。homebrewとかdnfとかでインストールするやつですね。
Dockerのrubyイメージは、Debianをベースに構成されています。そのため、ImageMagickをインストールするためのコマンドは以下となります。
# apt install imagemagick -y
yumにおけるパッケージ名(Railsチュートリアル本文に記述されていたものです)とは異なり、imagemagick
は全て小文字となります。
実際に画像のリサイズを行うように画像アップローダーを修正する
今回は、「画像の縦横どちらかが400pxを超えていた場合、適切なサイズに縮小する。但し、画像を引き伸ばすことはしない。」という内容の実装とします。
MiniMagick gemについて
RubyでImageMagickを使うためのgemはMiniMagickといいます。gemそのもののインストールは、CarrierWave gemのインストールと同時に済ませています。
source 'https://rubygems.org'
# ...略
gem 'carrierwave', '1.2.2'
gem 'mini_magick', '4.7.0' # <-- 既にインストール済み
# ...略
group :production do
gem 'pg', '0.20.0'
gem 'fog', '1.42'
end
# ...略
CarrierWave::MiniMagick
モジュールについて
CarrierWaveには、MiniMagickを使うための機能が含まれています。但し、当該機能を使うためにはCarrierWave::MiniMagick
というモジュールをinclude
する必要があります。
include CarrierWave::MiniMagick
画像のリサイズ処理の実体
「画像の縦横どちらかが400pxを超えていた場合、適切なサイズに縮小する。但し、画像を引き伸ばすことはしない。」という内容の実装の場合、その実体は以下のようになります。
process resize_to_limit: [400, 400]
process
メソッドに、resize_to_limit
というシンボルをキーとするハッシュを与えます。ハッシュの値には、[縦ピクセル数, 横ピクセル数、{オプション}]
という配列を与えます。
Pictureアップローダーの内容を変更する
上記を総合すると、app/uploaders/picture_uploader.rb
の変更内容は以下のようになります。
class PictureUploader < CarrierWave::Uploader::Base
# Include RMagick or MiniMagick support:
# include CarrierWave::RMagick
- # include CarrierWave::MiniMagick
+ include CarrierWave::MiniMagick
process resize_to_limit: [400, 400]
# Choose what kind of storage to use for this uploader:
storage :file
# storage :fog
...略
# Add a white list of extensions which are allowed to be uploaded.
# For images you might use something like this:
def extension_whitelist
%w(jpg jpeg gif png)
end
...略
end