共计 4279 个字符,预计需要花费 11 分钟才能阅读完成。
事件起因
凭借多年吃瓜教训,花 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" }
这 …..,好家伙,后果还好,人没事,地点也挺正规的,这下二狗应该不必放心平安问题,能够一块去喝酒了。
实际出真知
看到这里,平时深信不疑的小伙伴是不是蠢蠢欲动了呢,上面我就来拆分几步走。
- 剖析图片
首先,引入一个 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 也有手动版做法。
- 手动转换经纬度
关上网址 http://www.minigps.net/fc.html,能够在线将度分秒格局转换成经纬度。
- 手动定位坐标
关上拾取坐标零碎,输出上一步失去的经纬度,就能够查看到具体地址
git 地址
我的项目会上传至 git,有趣味的小伙伴能够拉下来试试,地址为:https://github.com/zsh5775317…
最初
最初廓清一下,二狗至今独身,哪有什么坏心理,又怎么会有女朋友,本故事纯属虚构,如有雷同,emmm….. 再见。
点关注,防走丢
以上就是本期全部内容,如有纰漏之处,请留言指教,非常感谢。我是花 Gie,有问题大家随时留言探讨,咱们下期见🦮。
文章继续更新,能够微信搜一搜 Java 开发零到壹 第一工夫浏览,并且能够获取 面试材料学习视频 等,有趣味的小伙伴欢送关注,一起学习,一起哈🐮🥃。
原创不易,你怎忍心白嫖 ,如果你感觉这篇文章对你有点用的话,感激老铁为本文 点个赞、评论或转发一下
,因为这将是我输入更多优质文章的能源,感激!