環境: Max OS X Lion + Ruby 1.8.7 + ImageMagick 6.7.5

ディレクトリの中にある画像ファイルのサムネイルを生成するスクリプト thumbcre.rb の中身。


#!/usr/bin/env ruby
 
# ファイル名のリストを取得
def get_file_names(target_dir)
  entries = Dir.entries(target_dir)
  result = []
  entries.each{|e|
    # ディレクトリは不要
    if e != '.' && e != '..'
      path = target_dir + '/' + e
      result.push(e) if FileTest.file?(path)
    end
  }
  return result
end
 
# ImageMagick の convert コマンドでサムネイルを生成
def make_thumbnail(srcpath, dstpath)
  # [0]はアニメーションGIFのときに最初の1枚目を使う指定
  # 縦横比が変わっても気にしない。すべて150x150ピクセルのサムネイルを生成
  command = "convert #{srcpath}[0] -resize 150x150! #{dstpath}"
  if !system(command)
    raise "ERROR: make_thumbnail"
  end
end
 
if ARGV.length < 2
  puts "Usage: ruby #{File.basename(__FILE__)} <src_dir> <dst_dir>"
  exit
end
 
# 元画像置場
srcdir = ARGV[0]
 
# サムネイル画像置き場
dstdir = ARGV[1]
 
# 元ファイル一覧を取得
filenames = get_file_names(srcdir)
 
# サムネイル画像が無ければ生成する
filenames.each{|filename|
  # 元のファイルがJPEGでもPNGでもJPEGのサムネイルを生成
  srcpath = File.join(srcdir, filename)
  dstpath = File.join(dstdir, File.basename(filename, '.*') + '.jpg')
  # すでにサムネイルが存在するなら生成しない
  if !FileTest.exist?(dstpath)
    make_thumbnail(srcpath, dstpath)
  end
}

src ディレクトリにある画像ファイルのサムネイルを dst ディレクトリに生成する。


$ ls -la ./src/
total 184
drwxr-xr-x  5 hoge  staff    170  8  1 19:14 .
drwxr-xr-x  6 hoge  staff    204  8  1 19:20 ..
-rw-r--r--  1 hoge  staff  83740 11 24 20:05 14957715.jpg
-rw-r--r--  1 hoge  staff   3854  7 31 20:02 a.b.c.png
-rw-r--r--  1 hoge  staff   2578  8  1 19:01 hello.gif
 
$ ls -la ./dst/
total 0
drwxr-xr-x  2 hoge  staff   68  8  1 19:21 .
drwxr-xr-x  6 hoge  staff  204  8  1 19:20 ..
 
$ ./thumbcre.rb ./src/ ./dst
 
$ ls -la ./dst
total 80
drwxr-xr-x  5 hoge  staff    170  8  1 19:21 .
drwxr-xr-x  6 hoge  staff    204  8  1 19:20 ..
-rw-r--r--  1 hoge  staff  17391  8  1 19:21 14957715.jpg
-rw-r--r--  1 hoge  staff   8330  8  1 19:21 a.b.c.jpg
-rw-r--r--  1 hoge  staff   6202  8  1 19:21 hello.jpg

ちなみに、ここでテストしたa.b.c.pngとhello.gifは生成したサムネイル(150x150)より小さい画像で、gifはアニメーションGIFになっている。

Ref.

tags: ruby imagemagick

Posted by NI-Lab. (@nilab)