Railsで華麗に画像処理

(一応、Railsと華麗をかけています)

Railsのfile_columnというプラグインが秀逸です。

必要なもの

  1. ImageMagick
  2. RMagick
    1. ImageMagickRubyインタフェースでRubyからImageMagickが利用できるようになる。
    2. 強い依存関係があるみたいで、両者のバージョンに注意。
    3. こちらImageMagickとRMagickがワンセットになっているものがあるのでそれをダウンロードすると便利です。(下の方にある『RMagick-2.10.0-ImageMagick-6.5.3-10-Q8.zip』とかです)
  3. file_column
    1. 下記コマンドでfile_columnプラグインのインストールする。
      >ruby script/plugin install http://opensvn.csie.org/rails_file_column/plugins/file_column/trunk
    2. {RAILS_ROOT}\vendor\plugins\trunk ができると思うので、{RAILS_ROOT}\vendor\plugins\file_column にリネームする。

使い方

  1. テーブル
    1. ファイル名を格納する列、もしくはテーブルを用意する。
      t.string image
  2. モデル
    1. 以下のように追加する。
      file_column :image, :magick => {:versions => {:thumb => {:size => "100x100"},
      :medium => {:size => "150x150"}
      }
      },
      :web_root => "images/",
      :root_path => File.join(RAILS_ROOT, "public","images") #この場所にファイルが作られる
    2. versionsのハッシュのキー(上の例では:thumbと:medium)は任意で、好きなキー名が指定できます。
    3. sizeは横×縦です。
    4. sizeの指定は以下の3パターンがあります。
      1. "100x150":縦横比を維持して、このサイズに収まる大きさにします。
      2. "100x150>":これより小さい画像は小さいままで、拡大しません。
      3. "100x150!":縦横比を無視して、このサイズぴったりに合わせます。
  3. ビュー(入力)
    1. 例として、複数画像をアップロードする場合です。
      <%= file_column_field 'photo[0]', 'image' %>
      <%= file_column_field 'photo[1]', 'image' %>
      <%= file_column_field 'photo[2]', 'image' %>
    2. file_column_fieldの第一引数はパラメータハッシュKeyで、第二引数はそのバリューの中のハッシュKey(?)です。
    3. 分かりにくいと思いますが、こんな感じでパラメータが送られます。
      {"photo"=>{"0"=>{"image_temp"=>"", "image"=>#},
      "1"=>{"image_temp"=>"", "image"=>#},
      "2"=>{"image_temp"=>""}
      },
      "commit"=>"更新",
      "authenticity_token"=>"xxx"}
  4. コントローラ
    1. 上のパラメータを受け取ったアクションでは、こんな感じで処理します。
          params[:photo].each { |key, photo|
      Photo.create(photo) unless photo[:image].nil?
      }
  5. ビュー(表示)
    1. 画像を任意のサイズで表示するときもこんな感じで簡単にできます。
      <%=  image_tag(url_for_image_column('photo', 'image', :thumb)) %>
    2. url_for_image_columnの第一引数はインスタンス変数名、第二引数はメソッド名(カラム名)、第三引数はサイズ(上のモデルで記述したversionsのキー)です。