EXIF情報の取得

デジカメから取り込むときに日付のファイル名にしたいので、何かないかなと調べてみる。

4651 % gem query --remote --all --details --name-matches exif            [pts/0]

 *** REMOTE GEMS ***

exifr (0.10.9, 0.10.8, 0.10.7, 0.10.6, 0.10.5, 0.10.4, 0.10.3, 0.10.2, 0.10.1, 0.10, 0.9.6, 0.9.5.1, 0.9.5, 0.9.4, 0.9.3, 0.9.2, 0.9.1, 0.9)
    Author: R.W. van 't Veer
    Homepage: http://github.com/remvee/exifr/

    EXIF Reader is a module to read EXIF from JPEG images.

extexif (1.0.1, 1.0.0)
    Author: Rakuto Furutani
    Rubyforge: http://rubyforge.org/projects/extexif
    Homepage:     by Rakuto Furutani

    an ruby-libexif extended to support GPS Exif data.

mini_exiftool (1.0.1, 1.0.0, 0.7.0, 0.6.0, 0.5.1, 0.5.0, 0.4.1, 0.4.0, 0.3.1, 0.3.0, 0.2.0, 0.1.1, 0.1.0, 0.0.1)
    Author: Jan Friedrich
    Rubyforge: http://rubyforge.org/projects/miniexiftool
    Homepage: http://miniexiftool.rubyforge.org/

    A library for nice OO access to the Exiftool command-line
    application written by Phil Harvey.

multi_exiftool (0.0.1)
    Author: Jan Friedrich
    Rubyforge: http://rubyforge.org/projects/multiexiftool
    Homepage: http://multiexiftool.rubyforge.org

活動状況とかみて、今回は exifr を使ってみる。

% sudo gem install exifr
[sudo] password for siz: 
Successfully installed exifr-0.10.9
1 gem installed
Installing ri documentation for exifr-0.10.9...
Installing RDoc documentation for exifr-0.10.9...

日付を取得するのは、date_time_original で良いのかなぁ?とりあえず、SDカードから、コピーするプログラムを作成。ディレクトリとか直に書いているけど。。。

#!/usr/bin/env ruby

require 'rubygems'
require 'exifr'

INPUT_DIR="/media/card/DCIM/100KCA39"
OUTPUT_DIR="/hu/vfat/_photo"

unless File.directory?(OUTPUT_DIR)
  puts "no such directory: #{OUTPUT_DIR}"
  exit 1
end

Dir.glob("#{INPUT_DIR}/*.{jpg,JPG}") do |input|
  time = EXIFR::JPEG.new(input).date_time_original

  dir = "#{OUTPUT_DIR}/#{time.year}"
  Dir.mkdir(dir) unless File.directory?(dir)

  output = "#{dir}/#{time.strftime("%Y%m%d_%H%M%S")}.jpg"
  if File.exist?(output)
    puts "File already exist: #{output}"
  else
    puts "#{input} -> #{output}"
    FileUtils.copy_file(input, output, true) unless File.exist?(output)
  end
end