Railsで画像サイズを"簡単に"操る(Image Size in Rails)

FileColumnプラグインを使うと、画像を任意のサイズにリサイズできるのですが、それにはRMagickImageMagickが必要で、環境構築が大変です。そこでimgタグのheight、widthオプションで画像を適切なサイズで表示するようにしました。

仕様は以下の通り。

  • 画像表示枠の最大サイズ(縦、横)を指定
  • その枠内に収まるサイズの画像は元のサイズのまま表示
  • 枠からはみ出す画像は縦横比は変えずにその枠内におさめる

これ自体は画像サイズさえ取得できれば簡単な処理なので、RMagickとImageMagickの代わりにRAA - image_sizeを使います。

やり方は以下の通り。

1.image_sizeをダウンロードしてきてRailsプロジェクトのlib/ディレクトリにimage_size.rbを入れる

2.任意のヘルパー(一番単純なのはapplication_helper.rb)にサイズ調整メソッドを定義

require "image_size"

def small_size ( img_dir ) image_size( img_dir, 90, 90 ) end
def default_size ( img_dir ) image_size( img_dir, 600, 400 ) end
def image_size ( img_dir, max_height, max_width ) # Railsプロジェクトのpublicディレクトリまでの絶対パス public_dir = "/path/to/rails_root/public" open(public_dir+img_dir,"rb") do |img| img_file = ImageSize.new(img) w = max_width*1.0 / img_file.get_width h = max_height*1.0 / img_file.get_height if w > 1.0 && h > 1.0 return { :width => (img_file.get_width).to_i, :height => (img_file.get_height).to_i } elsif w < h return { :width => (img_file.get_width*w).to_i, :height => (img_file.get_height*w).to_i } else return { :width => (img_file.get_width*h).to_i, :height => (img_file.get_height*h).to_i } end end end

3.ビュー側でこいつを呼び出して画像サイズを取得

(app/views/user/show.rhtml)
<% image_size = default_size( url_for_file_column( "user", "photo" ) ) %>
<%= image_tag ( url_for_file_column( "user", "photo" ), 
    :height => image_size[:height], :width => image_size[:width] ) %>


これで画像表示枠のサイズ内に収まる最適なサイズで画像を表示できるようになります。
もちろんビュー側で

<% image_size = image_size( url_for_file_column( "user", "photo" ), 300, 300 ) %>

とか

<% image_size = image_size( "/public/images/banner.jpg", 700, 250 ) %>

と指定することも可能です。

これ最初、public_dirを追加しないと行けないことに気づかずにハマった。
こいつをFileColumnに組み込めると良いのだが。

<%= image_tag ( url_for_file_column( "user", "photo" ), 
    :max_height => 400, :max_width => 600 ) %>

とかにできるとだいぶすっきり。