免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2976 | 回复: 1
打印 上一主题 下一主题

使用Ruby解析图片EXIF数据获取坐标信息 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-06 14:40 |只看该作者 |倒序浏览
使用Ruby解析图片EXIF数据获取坐标信息





最近在做一个项目时需要将图片EXIF信息解析出来并获取相应GPS坐标信息,用于在Google Map中使用, 找到了一些Ruby解析EXIF信息的类库, 相比之下还是 exifr这个gem不错, 零依赖,直接ruby调用.

1. 获取EXIF信息

  1. require 'rubygems'
  2. require 'exifr'

  3. obj = EXIFR::JPEG.new('geo.jpg')
  4. if obj.exif?
  5.   puts "--- EXIF information ---".center(50)
  6.   hash??= obj.exif.to_hash
  7.   hash.each_pair do |k, v|
  8.     puts "-- #{k.to_s.rjust(20)} -> #{v}"
  9.   end
  10. end
复制代码
运行上述代码后效果如下:
  1.         --- EXIF information ---            
  2. --     gps_latitude_ref -> N
  3. --    pixel_x_dimension -> 600
  4. --   date_time_original -> Sat Nov 21 09:24:08 +0800 2009
  5. --         y_resolution -> 72
  6. --      resolution_unit -> 2
  7. -- gps_img_direction_ref -> T
  8. --     exposure_program -> 2
  9. --   ycb_cr_positioning -> 1
  10. --            sharpness -> 1
  11. --    pixel_y_dimension -> 800
  12. --                flash -> 32
  13. --  date_time_digitized -> Sat Nov 21 09:24:08 +0800 2009
  14. --                 make -> Apple
  15. --    gps_img_direction -> 102933/295
  16. --        gps_longitude -> 104809/200
  17. --         focal_length -> 77/20
  18. --                model -> iPhone 3GS
  19. --             software -> 3.1.2
  20. --       gps_time_stamp -> 924417/100
  21. --    iso_speed_ratings -> 76
  22. --    gps_longitude_ref -> W
  23. --            date_time -> Sat Nov 21 09:24:08 +0800 2009
  24. --        exposure_mode -> 0
  25. --  shutter_speed_value -> 5855/1277
  26. --        exposure_time -> 1/24
  27. --         gps_latitude -> 391019/200
  28. --       sensing_method -> 2
  29. --          color_space -> 1
  30. --        metering_mode -> 1
  31. --         x_resolution -> 72
  32. --        white_balance -> 0
  33. --       aperture_value -> 4281/1441
  34. --             f_number -> 14/5
复制代码
未加工前的坐标信息是以时/分/秒构成的, 类似这样:
  1. :gps_latitude=>[Rational(39, 1), Rational(1019, 20), Rational(0, 1)]
复制代码
为了在Google Map中显示图片拍摄的位置信息,需要得到坐标的两个值, 但直接获取的数据仍然需要进行一下加工方可正常使用.
2. 加工坐标信息
  1. lat = obj.exif[0].gps_latitude[0].to_f + (obj.exif[0].gps_latitude[1].to_f / 60) + (obj.exif[0].gps_latitude[2].to_f / 3600)
  2. lat = lat * -1 if obj.exif[0].gps_latitude_ref == 'S'    # (N is +, S is -)
  3. long = obj.exif[0].gps_longitude[0].to_f + (obj.exif[0].gps_longitude[1].to_f / 60) + (obj.exif[0].gps_longitude[2].to_f / 3600)
  4. long = long * -1 if obj.exif[0].gps_longitude_ref == 'W' # (W is -, E is +) 加工后的坐标信息类似这样:


  5. 39.8491666666667 #  lat
  6. -104.674166666667 # long
复制代码
坐标转换方法
  1. # Example. Assume a latitude of 45° 53' 36" (45 degrees, 53 minutes and 36 seconds). In degrees, the latitude will be:
  2. latitude = 45 + (53 / 60) + (36 / 3600) = 45.89
  3. # General Formulation:
  4. latitude (degrees) = degrees + (minutes / 60) + (seconds / 3600)
复制代码
完事, 收工

论坛徽章:
0
2 [报告]
发表于 2011-04-06 15:36 |只看该作者
hash??= obj.exif.to_hash
俩问号是啥么意思》??》?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP