事情起因

image.png

凭借多年吃瓜经验,花Gie觉得很不对劲,果断让二狗等我片刻。

啪啪啪....Two hours later

一通代码乱敲,紧急写了二十行代码,对照片进行了一通分析。

public static void main(String[] args) throws JpegProcessingException, IOException {
    PicAnalysis("C:\\Users\\86157\\Desktop\\123.jpg");
}
public static  void PicAnalysis(String path) throws JpegProcessingException, IOException {
    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();
            System.out.println(tag);
        }
    }
    System.out.println("图片分析完毕!");
}

拿到结果如下:

拍摄时间:2021:07:08 20:07:36
拍摄地点:上海市黄浦区外滩街道七重天宾馆
手机型号:HUAWEI SEA-AL10
    
{ "status": "1", "regeocode": { "addressComponent": { "city": [], "province": "上海市", "adcode": "310101", "district": "黄浦区", "towncode": "310101013000", "streetNumber": { "number": "406-1号", "location": "121.485570,31.240797", "direction": "东北", "distance": "2.35113", "street": "江西中路" }, "country": "中国", "township": "外滩街道", "businessAreas": [ { "location": "121.480979,31.245711", "name": "七浦路", "id": "310106" }, { "location": "121.503076,31.252427", "name": "北外滩", "id": "310109" }, { "location": "121.502898,31.252714", "name": "提篮桥", "id": "310109" } ], "building": { "name": "上海市物流学会(江西中路)", "type": "科教文化服务;科研机构;科研机构" }, "neighborhood": { "name": [], "type": [] }, "citycode": "021" }, "formatted_address": "上海市黄浦区外滩街道七重天宾馆" }, "info": "OK", "infocode": "10000" }

这.....,好家伙,结果还好,人没事,地点也挺正规的,这下二狗应该不用担心安全问题,可以一块去喝酒了。

image.png

实践出真知

看到这里,平时疑神疑鬼的小伙伴是不是跃跃欲试了呢,下面我就来拆分几步走。

  • 分析图片

首先,引入一个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 ResolutionX/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也有手动版做法。

  • 手动转换经纬度

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

  • 手动定位坐标

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

image.png

git地址

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

最后

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

点关注,防走丢

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

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

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


4 声望0 粉丝