ruby-exif.rbでGPSTagを取得しようとしてTypeError
Windowsで動くexifを解析できるライブラリを探せないので、pure rubyらしいRuby-Exifを使ってみる。
ruby-exif.rbを改造して、GPSタグを取得できるruby-exif.rbを公開している方がいたので、使ってみたところTypeErrorが156行目の
a[2].times{|j| b << lpack(buf.slice(a[3]-offset+(8*j),4)).to_f / lpack(buf.slice(a[3]-offset+(8*j)+4,4)) }
というところで出る。
原因は、なんだかよくわからないがlongitudeが入っているあたりのbufをsliceして持ってくると、値が入っていないところがnilになって、nilはfloatには変換できませんとかいわれてしまうのが理由みたい。
エラーが出る以前に取得しているデータは正しそうだったので、直してみた。
ruby的な書き方は、Ruby歴3日の僕にはできないが、その部分だけ書き換えたのが
a[2].times{|j| b1 = buf.slice(a[3]-offset+(8*j),4) b2 = buf.slice(a[3]-offset+(8*j)+4,4) if b1.nil? and b2.nil? b << 0 next end p1 = lpack(b1) p2 = lpack(b2) if(p2.nil?) b << p1.to_f elsif b << p1.to_f / p2 end }
このコード。きっと一行で書けるんだろうけど・・・
というわけで無事
@exif = Exif::new(@filename) p @exif.info
見たいなコードで
{"GPSLatitude"=>"35.9.0.00", "Model"=>"iPhone\000", "GPSLongitudeRef"=>1459617792, "DateTimeOriginal"=>"2008:07:23 15:13:48\000", "XResolution"=>"72/1", "ResolutionUnit"=>2, "ExifIFDPointer"=>171, "Maker"=>"Apple\000", "GPSLongitude"=>"136.5802.0.00", "GPSInfoIFDPointer"=>317, "YResolution"=>"72/1", "Orientation"=>1, "GPSLatitudeRef"=>1308622848, "DateTime"=>"2008:07:23 15:13:48\000"}
というデータが取れた。
・・・今見たら、けつにごみがついてるなぁ・・・
追記:
というかそもそもあまり理解していなかったけどExif 2.1 GPS IFD tags辺りを見るに、"GPSLongitudeRef"=>1459617792って、明らかにおかしいな。
[1, 2, 2, 1308622848] [2, 5, 3, 371] [3, 2, 2, 1459617792] [4, 5, 3, 395]
ってデータが取れるんだけど。あぁいいのか。
1308622848 => 01000111000000000000000000000000 => N 1459617792 => 01010111000000000000000000000000 => W
か。にしても面倒くさいから別の使おうかな。