ImageScienceを使ってみる

Tsukasa OISHI

 RubyKaigisecondlifeさんが モテる Ruby!で紹介されていた ImageScienceを使ってみた。写真からサムネイルやリサイズされた画像を作るクラス。milookの自己紹介用写真のサイズをこいつで統一しちゃおうというわけ。
 ImageScienceには、 FreeImageRubyInlineが必要なので、こいつを先にインストールしておきます。
 FreeImageのほうはソースをダウンロードして解凍して、make, make install でOK。makeしているときに、g++が必要と言われたら、apt-get install g++ または yum install gcc-c++ などでインストールしてあげます。

make
make install

 RubyInlineはrubygemで

sudo gem install RubyInline

そうしてから、ImageScienceのインストールをします。

sudo gem install image_science

 ここまできたらあとは使うだけです。
 milookでのイメージアップロードの処理をするフォトモデルのメソッドは次のような感じになりました。

require 'rubygems'
require 'image_science'
……
  def upload_file=(file_field)
    if !file_field || file_field == ''
      self.destroy
    else
      self.name = base_part_of(file_field.original_filename)
      self.content_type = file_field.content_type.chomp

      if file_field.kind_of? StringIO
        work_file = "/tmp/#{self.name}"
        File.open(work_file, 'w') do |f|
          f.write file_field.read
        end
      else
        work_file = file_field.path
      end

      ImageScience.with_image(work_file) do |img|
        img.cropped_thumbnail(210) do |t|
          t.save work_file
          self.data = file_field.read
          if file_field.kind_of? StringIO
            File.open(work_file, 'r') do |f|
              self.data = f.read
            end
            File.delete(work_file)
          end
        end
      end
    end
  end

ImageScienceのwith_imageがパス名しか受け付けなかったようだったので、StringIOクラスで渡されてきたときは、一度ローカルに保存する処理が必要になりました。もしかしたら、そんなことしなくてもいい方法がありそうな気もしますが、そこまで時間をかけて調べられなかったので、今日のところはとりあえずこれで。
require 'rubygems'とrequire 'image_science' を忘れがちなので気を付けようっと。
 サムネイルを作るメソッドは、cropped_thumbnailとthumbnailがあるのだけど、thumbnailは縦横比の変更はしない。縦横比を1:1にするのが、cropped_thumbnailです。