2014.04.19
wolfgang

Rubyで画像ファイルを分類する

こんにちは、二回目の投稿です。
たわしです。

前回の記事で「自動化」というキーワードを書きましたので、
今回は最近自分が行った自動化を話したいと思います。

例.特定ディレクトリ内の全画像ファイルの大きさを分類したい
(縦×横が等幅の拡張子がpngの画像ファイルとする)
・150px:1(小サイズ)
・200px:2(中サイズ)
・300px:3(大サイズ)

Rubyで画像サイズ情報取得用のスクリプトを書きます。
[環境]
・Mac OS 10.9.2
・Ruby 2.0.0p247

事前準備として、画像情報取得用にrmagicのgemをinstallします。

[bash]
$ brew install imagemagick
$ gem i rmagick
[/bash]

細かいコードの解説は省きますが、処理の流れです。

  1. カレントディレクトリのファイルを全部なめて、拡張子がpngのファイルの画像情報取得
  2. 1ファイルずつイテレータの中でサイズを判定し、事前に用意しておいたカウンタをインクリメント
  3. ループ終了後にカウンタの情報を出力

[ruby]
require ‘RMagick’
require ‘find’
require "FileUtils"

SIZE = { S: 100, M: 200, L: 300 }

def image_classifying
info, info[:small_cnt], info[:middle_cnt], info[:big_cnt] = {}, 0, 0, 0

Find.find(‘.’) do |item|
if File::ftype(item) == ‘file’
if item =~ /.*.png/i
img = Magick::Image.read(item).first

case img.columns
when SIZE[:S]
info[:small_cnt] += 1
when SIZE[:M]
info[:middle_cnt] += 1
when SIZE[:L]
info[:big_cnt] += 1
end
end
end
end

info
end

info = image_classifying
puts "小サイズ: #{info[:small_cnt]}"
puts "中サイズ: #{info[:middle_cnt]}"
puts "大サイズ: #{info[:big_cnt]}"
[/ruby]

作成したスクリプトを画像ファイルが置いてあるディレクトリに配置し、

[bash]
$ ruby image_info.rb
[/bash]

コンソールに結果が出力されます。

スクリーンショット 2014-04-17 19.01.03

まとめ
手動で数えた方が早いよ。と思う方もいらっしゃると思いますが、
数が少ないうちはよくても、増えると人力では限界ですよね…
また、コマンド一発で評価してくれるので、スクリプトを書いたほうが、
手動に比べてかなりの時間の短縮になります。
何度も行うこと、人力でのミスが起きやすい単純作業に関しては
プログラミングで解決したいですね。