0
2

More than 3 years have passed since last update.

Railsチュートリアル 第13章 ユーザーのマイクロポスト - 画像のリサイズ

Posted at

画像の自動リサイズ処理が必要な理由

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

スクリーンショット 2020-01-10 8.15.32.png

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のインストールと同時に済ませています。

Gemfile
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の変更内容は以下のようになります。

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
0
2
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
0
2