照片也能实现GPS定位?以后还是不要轻易发图了…

本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!

前言

最近工作中遇到处理图片的一些场景,主要是批量提取图片中一些图像宽高、分辨率以及物理焦距等信息。然后在使用过程中也是看到图片中包含了很多其他有用的信息,本文就和大家一起分享这个小技巧吧。

代码过程

下面我就来拆分几个步骤,来看一下代码实现。

  • 分析图片

首先,引入一个jar包

 <dependency>
     <groupId>com.drewnoakes</groupId>
     <artifactId>metadata-extractor</artifactId>
     <version>2.16.0</version>
 </dependency>
复制代码

然后写一个方法,获取图片中的详细信息,包括拍摄时间位置信息手机型号等。

//分析图片获取地址
public static  Map<String,String> PicAnalysis(String path) throws JpegProcessingException, 		IOException {
    Map<String,String> map = new HashMap();
    System.out.println("强大的语言正在识别图片地址...");
    File picFile = new File(path);
    Metadata metadata = JpegMetadataReader.readMetadata(picFile);
    Iterator<Directory> it = metadata.getDirectories().iterator();
    while (it.hasNext()) {
        Directory exif = it.next();
        Iterator<Tag> tags = exif.getTags().iterator();
        while (tags.hasNext()) {
            Tag tag = tags.next();
            map.put(tag.getTagName(),tag.getDescription());
            System.out.println(tag.getTagName() + ":" +tag.getDescription());
        }
    }
    System.out.println("图片分析完毕!");
    return map;
}
复制代码

该方法会返回如下信息,相当多,这里整理成表格:

参数 说明
Make 产品生产厂家
Model 设备型号
Orientation 方向
X Resolution/Y Resolution X/Y方向分辨率
ResolutionUnit 分辨率单位
DateTime 日期和时间
Software 软件版本
ISO speed ratings 感光度
Date/Time Original 创建时间
Date/Time Digitized 数字化时间
Components Configuration 图像构造(多指色彩组合方案)
Compressed Bits Per Pixel 压缩时每像素色彩位 指压缩程度
Exposure Bias Value 曝光补偿
Max Aperture Value 最大光圈
Metering Mode 测光方式, 平均式测光、中央重点测光、点测光等
Flash 是否使用闪光灯
Focal Length 焦距,一般显示镜头物理焦距
Makernote 作者标记、说明、记录
Color Space 色域、色彩空间
Exif Image Width 图像宽度,指横向像素数
Exif Image Height 图像高度,指纵向像素数
  • 转换成坐标

从图片中拿出的信息为度分秒格式:即30° 14' 32.52",我们需要将其转换为经纬度:如121.485559,31.240778,代码如下:

public static String translate(String Gps) {
    String a = Gps.split("°")[0].replace(" ", "");
    String b = Gps.split("°")[1].split("'")[0].replace(" ", "");
    String c = Gps.split("°")[1].split("'")[1].replace(" ", "").replace("\"", "");
    double gps = Double.parseDouble(a)+Double.parseDouble(b)/60 + Double.parseDouble(c)/60/60;
    return String.valueOf(gps);
}
复制代码
  • 揭开最终面纱

获取到具体坐标后,这距离成功只有半步之遥,接下来调用高德地图的Api来获取具体地址。

 public static void getAddress( Map<String,String> param){
        String str = RequestUtils.sendGet("https://restapi.amap.com/v3/geocode/regeo", "key=5a3c45fd68d04bbc&location="+translate(param.get("GPS Longitude"))+","+translate(param.get("GPS Latitude")));
        JSONObject result = JSON.parseObject(str);
        System.out.println("拍摄时间:" +param.get("Date/Time"));
        System.out.println("拍摄地点:" +result.getJSONObject("regeocode").getString("formatted_address"));
        System.out.println("手机型号:" +param.get("Make") +" " + param.get("Model"));
        System.out.println(str);
    }
复制代码

不过我们首先要进入高德地图开发者平台,没有申请个人开发者身份的需要先进行申请,申请步骤比较简单,申请后每天会有指定数量的免费调用次数,足够个人使用。

懒人的玩法

如果觉得太麻烦,不想申请开发者,哎,就是玩,就是不想申请,那花Gie也有手动版做法。

  • 手动转换经纬度

打开网址 www.minigps.net/fc.html ,可以在线将度分秒格式转换成经纬度。

  • 手动定位坐标

打开拾取坐标系统,输入上一步得到的经纬度,就可以查看到具体地址

image.png

git地址

项目会上传至git,有兴趣的小伙伴可以拉下来试试,地址为:github.com/zsh57753173…

最后

最后澄清一下,二狗至今单身,哪有什么坏心思,又怎么会有女朋友,本故事纯属虚构,如有雷同,emmm.....再见。

点关注,防走丢

以上就是本期全部内容,如有纰漏之处,请留言指教,非常感谢。我是花Gie,有问题大家随时留言讨论 ,我们下期见🦮。

文章持续更新,可以微信搜一搜 Java开发零到壹 第一时间阅读,并且可以获取面试资料学习视频等,有兴趣的小伙伴欢迎关注,一起学习,一起哈🐮🥃。

原创不易,你怎忍心白嫖,如果你觉得这篇文章对你有点用的话,感谢老铁为本文点个赞、评论或转发一下,因为这将是我输出更多优质文章的动力,感谢!