今回は任意のフォルダ内の写真データを一覧で取得する方法についてみていきます。
まず、写真データとは何かということですが、
Exifデータとなります。
写真データは、「Exchangeable image file format」という写真のメタ情報を含む
共通ファイルフォーマットで管理されております。
Exif情報には、「撮影日時」「撮影機器」のほか、
「シャッタースピード」「ISO」「絞り」などの撮影条件、
さらには撮影場所の「GPS」情報が項目として含まれます。
※すべての情報が必ず含まれるわけではありません。
たとえば、GPS情報はスマホなどで撮影しなければデジカメ写真には含まれていない場合もあります。
【GoogleフォトでのExif情報表示】
※下記画像における右の赤線で囲っている箇所がExif情報となります。
個々の写真のExif情報はGoogleフォト(旧・Picasa)、iPhotoなどで確認できるのですが、
データ分析で扱いやすい形式にするために、
ある特定のフォルダの写真に関する情報をエクセルシートなどで、一覧として管理していくことを考えていきます。
Rubyには写真データからExif情報取得を抽出するためのexifrというライブラリがありますため、
今回、それを利用する方法を見ていきます。
まずは、sudoでexifrをインストールします。
1 |
sudo gem install exifr |
単純に個別の写真データのExif情報を見るだけであれば下記スクリプトで確認できます。
※sample.JPGから、撮影日時を抽出する場合
1 2 |
require 'exifr' puts EXIFR::JPEG::new('sample.JPG').date_time |
利用シーンとしては、任意のフォルダを指定して、その中のすべての画像フォーマットのデータを、
一覧で取得したい、ということが多いかと思いますため下記のように変更していきます。
※dir_nameは取得したい任意の写真フォルダを指定
※下記の場合は指定したフォルダ内でJPGファイルだったときのみ、exifを抽出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
require 'exifr' require 'csv' puts Dir.pwd dir_name = "/Users/***/photo" Dir.chdir(dir_name) dir = Dir.open(dir_name) puts Dir.pwd CSV.open('photo.csv','wb') do |csv| csv << ['time','model','exposure','focus','lat','long'] dir.each { |name| if(/\.JPG/ =~ name) photo_date = EXIFR::JPEG::new(name).date_time photo_model = EXIFR::JPEG::new(name).model photo_to_s = EXIFR::JPEG::new(name).exposure_time.to_s photo_to_f = EXIFR::JPEG::new(name).f_number.to_f photo_lat = EXIFR::JPEG::new(name).gps_latitude photo_long = EXIFR::JPEG::new(name).gps_longitude csv << [photo_date,photo_model,photo_to_s,photo_to_f,photo_lat,photo_long] end } end |
上記により、任意のフォルダ内の写真ファイルのExif情報一覧を
同一フォルダ内に「photo.csv」ファイルとして下記のようなcsvに書き出すことができます。
※下記の例ではGPS情報をもたないデジカメ撮影のため、緯度経度情報は空白。
なお、exifrからEXifのどのような項目データを抽出できるかは、
exifrのgithubページを参照くださいませ。
ちなみに、たとえば、iPhotoのフォルダを指定したい場合、
「ピクチャ」→「iPhoto Library」→右クリックで「パッケージの内容を表示」で、
フォルダのパス名を確認することができます。
各写真は「Masters」フォルダの中の日付フォルダの中に格納されております。
以上、今回は写真データの取得についてみていきました。