2011年6月26日日曜日

flickrから人気の画像を取得し、rmagickを使って、サムネイルとしてリサイズする

flickrにはその日人気になった写真みたいなのをだしているので、その画像を取得し、150×150の画像にリサイズするプログラムです。
写真のサイズはそれぞれバラバラなので、大きい方の辺を150にし、足りない部分は背景を黒にしています。

一応サーバ上で動かすこと前提としています。

まずはサーバにImagemagickとRmagick、必要なライブラリをインストール

#画像編集に必要なライブラリをインストール(先にいれといたほうがいいらしいです)
# sudo yum install libjpeg-devel libpng-devel


#Image magickのインストール
# wget ftp://ftp.kddlabs.co.jp/graphics/ImageMagick/ImageMagick-6.7.0-8.tar.gz
# tar xvzf ImageMagick-6.7.0-8.tar.gz
# cd ImageMagick-6.7.0-8
# ./configure
# sudo make & make install

#Rmagickのインストール
# sudo gem install rmagick

このままだとなぜかlibMagickCore.so.2を読めないとか出てくるので、bash_profileに以下を追加
# vim .bash_profile
export LD_LIBRARY_PATH=/lib/
↑これを追加する。

これでインストールは完了。

次にこんな感じのファイルを作って、保存して、実行。

require 'rubygems'
require "RMagick"
require 'open-uri'
require 'nokogiri'
require 'uri'
include Magick #多分必要。


def flickr_img_download
 url = "http://www.flickr.com/explore/interesting/2011/06/"
 url_list = Array.new
 img_url_list = Array.new

 data = open( url )
 doc = Nokogiri::HTML( data )

#URLのリストを取得してます。
 doc.css('a').each do |f|
  begin
   if /\/explore\/interesting\/(\d+)\/(\d+)\/(\d+)\// =~ f.attribute('href').value
    url_list << f.attribute('href').value
   end
  rescue
   next
  end 
 end

 url_list.each do |f|
  img_url = URI.join(url, f)
  img_data = open( img_url )
  img_data = Nokogiri::HTML( img_data )
  img_data.css('img.pc_img').each do |img|
   img_url_list << img.attribute('src').value
  end
 end

 #画像を保存してます。
 img_url_list.each do |f|
  begin
   filename = File.basename( f )
   open("img/#{filename}", 'wb') do |file|
    open( f ) do |doc|
     file.write(doc.read)
     puts filename
    end
   end
  rescue
   next
  end
 end
end

def resize
 #背景の画像を作成
 whitefil = Magick::Image.new(150,150){self.background_color = 'none'}

 #フォルダ内の画像リストを作る。
 dir = Dir.glob(["./img/*.jpg", "./img/*.png"])

 dir.each do |filename|
  begin
   image = Magick::Image.read( filename ).first
   if image.columns < 150 or image.rows < 150 #サイズが150以下ならリサイズせずに余白だけ付ける。
     image = whitefil.composite(image, Magick::CenterGravity, Magick::OverCompositeOp)
   else image.columns > 150 or image.rows > 150 #サイズが150以上なら最大の幅を150になるよう、ファイルの比率は変えずに変換。
     image = image.resize_to_fit!(150,150)
     image = whitefil.composite(image, Magick::CenterGravity, Magick::OverCompositeOp)
   end
     image.write( filename )
  rescue Magick::ImageMagickError
   File.delete( filename )
   puts filename
  end
 end
end

flickr_img_download
resize

メソッド二回に分けてリサイズしているけど、本当は一回のメソッドで、かつ、リサイズ前のバックアップ用ファイルを別フォルダに保存しておきたい。
なぜか一回のメソッド中にやろうとすると、保存に失敗するので、こんな感じにしてます。
やり方知っている人がいたら助けてください。。。

0 件のコメント:

コメントを投稿