ImageScienceを使ってみる
RubyKaigiで secondlifeさんが モテる Ruby!で紹介されていた ImageScienceを使ってみた。写真からサムネイルやリサイズされた画像を作るクラス。milookの自己紹介用写真のサイズをこいつで統一しちゃおうというわけ。
ImageScienceには、 FreeImageと RubyInlineが必要なので、こいつを先にインストールしておきます。
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です。