読者です 読者をやめる 読者になる 読者になる

Paradigm Shift Design

ISHITOYA Kentaro's blog.

ruby-exif.rbでGPSTagを取得しようとしてTypeError

ruby

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

か。にしても面倒くさいから別の使おうかな。