写在前面
由于自己是个程序猿,所以有时候会跟朋友说,没事的时候不要随便发照片,容易造成信息泄露。由于今天相对于无聊,所以就带你们展示一下,怎么获取你发出去的照片背后的信息。
首先微信接了一张图,然后呢,点击下载原图,大概就是这样子:
image引入Maven依赖
<!-- 处理照片信息 -->
<dependency>
<groupId>com.drewnoakes</groupId>
<artifactId>metadata-extractor</artifactId>
<version>2.16.0</version>
</dependency>
<!-- Json信息 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
获取照片信息
public static Map<String, String> PicAnalysis(String path) throws JpegProcessingException, IOException {
Map<String, String> map = new HashMap();
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());
}
}
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 | 图像高度,指纵向像素数 |
获取经纬度
通过获取照片信息,我们可以找到对应的Gps位置信息,我们需要将Gps位置信息进行转化:
GPS Latitude:31° 17' 49.9"
GPS Longitude:121° 10' 19.24"
通过代码进行偏移量等计算转换:
private static String translate(String gpsLocation) {
String a = gpsLocation.split("°")[0].replace(" ", "");
String b = gpsLocation.split("°")[1].split("'")[0].replace(" ", "");
String c = gpsLocation.split("°")[1].split("'")[1].replace(" ", "").replace("\"", "");
double gps = Double.parseDouble(a) + Double.parseDouble(b) / 60 + Double.parseDouble(c) / 60 / 60;
return String.valueOf(gps);
}
获取位置信息
通过高德地图
来获取位置信息,当然你可以通过百度地图,谷歌地图等等接口都是没问题的,使用高德地图需要注册一下高德的开发者,然后创建一个应用,添加一个key
,例如我的key是5bd97ecd************d5ed25e7
,高德地图创建应用后点添加,然后选web服务即可。
private static void getAddress(Map<String, String> param) {
String gpsLng = translate(param.get("GPS Longitude"));
String gpsLat = translate(param.get("GPS Latitude"));
String str = RequestUtils.sendGet("https://restapi.amap.com/v3/geocode/regeo", "key=5bd97ecd************d5ed25e7&location=" + gpsLng + "," + gpsLat);
JSONObject result = JSONObject.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"));
}
获取到的信息
当然,可以获取到的不单单只有这些信息,还能拿到更多有用的信息,具体是什么,你慢慢猜吧。
拍摄时间:2021:07:12 18:40:29
拍摄地点:上海市嘉定区安亭镇昌吉路20号
手机型号:HUAWEI OXF-AN10
关于地址获取
如果你不想注册高德开发者,那也可以在转换经纬度以后,直接拿经纬度去百度搜索拾取坐标系统
,然后把经纬度输入进去进行搜索定位即可。
获取源码
想要获取源码,请关注公众号尘年码事
,回复照片识别
获取源码下载链接:
网友评论