サンプルコード
require 'time'
class ExifReader
def initialize
@loadable_rmagick = loadable_rmagick?
@loadable_exifr = loadable_exifr?
end
def to_s
"[#{self.class}]loadable rmagick: #{@loadable_rmagick}, loadable exifr: #{@loadable_exifr}"
end
# RMagick が使える場合は true を返す
def loadable_rmagick?
begin
require 'rmagick'
true
rescue LoadError => e
false
end
end
# EXIF Reader が使える場合は true を返す
def loadable_exifr?
begin
require 'exifr'
true
rescue LoadError => e
false
end
end
# 撮影日時を Time オブジェクトで返す (撮影日時情報が無い場合はnilを返す)
def datetime_original(file)
if @loadable_rmagick
datetime_original_by_rmagick(file)
elsif @loadable_exifr
datetime_original_by_exifr(file)
else
nil
end
end
def datetime_original_by_rmagick(file)
image = Magick::Image.read(file).first
dt = image.get_exif_by_entry('DateTimeOriginal')
if dt[0][1] != nil
Time.strptime(dt[0][1], '%Y:%m:%d %H:%M:%S')
else
nil
end
end
def datetime_original_by_exifr(file)
EXIFR::JPEG.new(file).date_time_original
end
end
er = ExifReader.new()
puts er
file = ARGV[0]
puts 'RMagick: ' + er.datetime_original_by_rmagick(file).to_s if er.loadable_rmagick?
puts 'Exifr: ' + er.datetime_original_by_exifr(file).to_s if er.loadable_exifr?
puts er.datetime_original(file)
サンプルコードの実行結果
$ ruby datetime_original.rb sample.jpg
[ExifReader]loadable rmagick: true, loadable exifr: true
RMagick: 2017-02-04 11:06:44 +0900
Exifr: 2017-02-04 11:06:44 +0900
2017-02-04 11:06:44 +0900
参考資料
- GitHub - rmagick/rmagick: Ruby bindings for ImageMagick https://github.com/rmagick/rmagick
- GitHub - remvee/exifr: EXIF Reader https://github.com/remvee/exifr/