2007年5月 4日

ImageMagick ( RMagick ) で大量の画像をWEB用に縮小

ImageMagick (RMagick)をMacにインストール したものの、何も使っていなかったので、試しにWEB用の画像をバッジ処理で自動縮小する ruby スクリプトをつくってみた。

画像を縮小する際のパラメーターは、プログラム内のscalesという配列で指定。large, small など名前のついた複数のハッシュを指定することで、複数のサイズの画像を出力します。各画像は、ハッシュのKey名のディレクトリに出力されます(無い場合はディレクトリ自動作成)。画像のサイズの指定は、画像の横の長さをピクセルで指定。yoko は横長画像、 tate は縦長画像の場合の、画像の横幅を指定。以下例。

scales = {
  "large" => {"yoko" => 800, "tate" => 400},
  "small" => {"yoko" => 500, "tate" => 250}
}

事前に,RMagick のインストールが必要です(ImageMagick (RMagick)をMacにインストール)。スクリプトの実行はターミナルなどで以下を実行。引数を二つ取ります。

$ ruby imageresizer.rb [元画像のディレクトリ] [画像保存先ディレクトリ]

例 ./original フォルダにある画像をすべて縮小処理して
   ./web フォルダに保存する
$ ruby imageresizer.rb ./original ./web

まだまだ勉強中であります。rmagick で複数画像をバッジ処理するときには、ループ内で GC.start をして明示的にガーベージ・コレクションをしないと、メモリ使用量が恐ろしいことになるのですね。。

imageresizer.rb.txt

require 'rubygems'
require 'RMagick'

class ImageResizer
  
  def initialize(load_path = ".", save_path = ".")
    
    @load_path = load_path
    @save_path = save_path
    Dir.mkdir(@save_path, 0755) unless FileTest.directory?(@save_path)
    @images = Dir.glob( @load_path + "/*.{jpeg,jpg}", File::FNM_CASEFOLD)
    
  end
    
  def resize(scales)
    
    # mkdir the sub direcotries to save images
    scales.each do |key, scale|
      Dir.mkdir(@save_path + "/" + key, 0755) unless FileTest.directory?(@save_path + "/" + key)
    end
    
    # Resize images and save them to sub directories
    @images.each do |image|
      
      original = Magick::Image.read(image).first
      width = original.columns
      height = original.rows
      
      scales.each do |key, scale|
        
        width > height ? 
          ratio = scale["yoko"].to_f / width : ratio = scale["tate"].to_f / width
        
        # resized = original.resize_to_fit ( scale["yoko"], scale["tate"] )
        resized = original.resize(ratio)
        resized.write(image.sub(@load_path, @save_path + "/" + key)) {self.quality = 80}        
      end

      GC.start
    end
  end
end

# 画像を縮小する際のパラメーターを、scalesで指定。
# large, small など複数のハッシュを指定することで、複数のサイズの画像を出力
# 各画像は、ハッシュのKey名のディレクトリに出力されます。
# 画像のサイズの指定は、画像の横の長さをピクセルで指定
# yoko は横長画像、 tate は縦長画像の場合の、画像の横幅を指定

scales = {
  "large" => {"yoko" => 800, "tate" => 400},
  "small" => {"yoko" => 500, "tate" => 250}
}

resizer = ImageResizer.new(ARGV[0], ARGV[1])
resizer.resize(scales)

exit
 

ブックマーク & はてなスター

コメント

s/バッジ処理/バッチ処理/g ?

Posted by: Bar at 2007年5月 4日 06:49

英語だけのコメントは、スパムフィルターではじかれてしまうので、日本語でのコメントをお願いします。

追加情報(必須ではありません)

(ページには表示されません)

Yes No

トラックバック

トラックバックURL

ブログ記事の情報

このページへのリンク

このブログを

作成日 : 2007年5月 4日 02:45