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 件のコメント:
コメントを投稿