4、拍照一张顺便查看照片详情
这里一定要确定拍的照片的详情时有经纬度信息的,如果没有,你针对你的手机在CSDN里搜索下怎么设置。这里顺便提下,CSDN的浏览器插件真香。简直就是我们技术人事的福音,再以不用担心某某度的广告之类导致找东西费劲了,而且它很包容,还时可以选择自己喜欢的搜索引擎的。
示例demo
这里先演示这个元数据提取jar能提取到的信息,顺便把取到的经纬度通过百度转地址。
因为是demo,没有业务,我这里就直接在测试类里干了。没有什么业务,不涉及什么机密,可以上全码。
Spring Boot 基础就不介绍了,推荐下这个实战教程: https://www.javastack.cn/categories/Spring-Boot/
package com.easylinkin.bm.extractor;
import com.alibaba.fastjson.JSONObject;
import com.drew.imaging.ImageMetadataReader;
import com.drew.imaging.ImageProcessingException;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.Tag;
import com.easylinkin.bm.util.HttpUtils;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.io.IOException;
/**
- @author zhengwen
**/
@Slf4j
public class ImgTestCode {
public static void main(String[] args) throws Exception {
File file = new File(“C:\Users\zhengwen\Desktop\test\IMG_20210820_093958.jpg”);
readImageInfo(file);
}
/**
-
提取照片里面的信息
-
@param file 照片文件
-
@throws ImageProcessingException
-
@throws Exception
*/
private static void readImageInfo(File file) throws ImageProcessingException, Exception {
Metadata metadata = ImageMetadataReader.readMetadata(file);
System.out.println(“—打印全部详情—”);
for (Directory directory : metadata.getDirectories()) {
for (Tag tag : directory.getTags()) {
System.out.format(“[%s] - %s = %s\n”,
directory.getName(), tag.getTagName(), tag.getDescription());
}
if (directory.hasErrors()) {
for (String error : directory.getErrors()) {
System.err.format(“ERROR: %s”, error);
}
}
}
System.out.println(“–打印常用信息—”);
Double lat = null;
Double lng = null;
for (Directory directory : metadata.getDirectories()) {
for (Tag tag : directory.getTags()) {
String tagName = tag.getTagName(); //标签名
String desc = tag.getDescription(); //标签信息
if (tagName.equals(“Image Height”)) {
System.err.println("图片高度: " + desc);
} else if (tagName.equals(“Image Width”)) {
System.err.println("图片宽度: " + desc);
} else if (tagName.equals(“Date/Time Original”)) {
System.err.println("拍摄时间: " + desc);
} else if (tagName.equals(“GPS Latitude”)) {
System.err.println("纬度 : " + desc);
System.err.println("纬度(度分秒格式) : " + pointToLatlong(desc));
lat = latLng2Decimal(desc);
} else if (tagName.equals(“GPS Longitude”)) {
System.err.println("经度: " + desc);
System.err.println("经度(度分秒格式): " + pointToLatlong(desc));
lng = latLng2Decimal(desc);
}
}
}
System.err.println(“–经纬度转地址–”);
//经纬度转地主使用百度api
convertGpsToLoaction(lat, lng);
}
/**
-
经纬度格式 转换为 度分秒格式 ,如果需要的话可以调用该方法进行转换
-
@param point 坐标点
-
@return
*/
public static String pointToLatlong(String point) {
Double du = Double.parseDouble(point.substring(0, point.indexOf(“°”)).trim());
Double fen = Double.parseDouble(point.substring(point.indexOf(“°”) + 1, point.indexOf(“'”)).trim());
Double miao = Double.parseDouble(point.substring(point.indexOf(“'”) + 1, point.indexOf(“”")).trim());
Double duStr = du + fen / 60 + miao / 60 / 60;
return duStr.toString();
}
/***
-
经纬度坐标格式转换(* °转十进制格式)
-
@param gps
*/
public static double latLng2Decimal(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_dou = Double.parseDouble(a) + Double.parseDouble(b) / 60 + Double.parseDouble© / 60 / 60;
return gps_dou;
}
/**
-
api_key:注册的百度api的key
-
coords:经纬度坐标
-
http://api.map.baidu.com/reverse_geocoding/v3/?ak=“+api_key+”&output=json&coordtype=wgs84ll&location="+coords
-
-
经纬度转地址信息
-
@param gps_latitude 维度
-
@param gps_longitude 精度
*/
private static void convertGpsToLoaction(double gps_latitude, double gps_longitude) throws IOException {
String apiKey = “YNxcSCAphFvuPD4LwcgWXwC3SEZZc7Ra”;
String res = “”;
String url = “http://api.map.baidu.com/reverse_geocoding/v3/?ak=” + apiKey + “&output=json&coordtype=wgs84ll&location=” + (gps_latitude + “,” + gps_longitude);
System.err.println(“【url】” + url);
res = HttpUtils.httpGet(url);
JSONObject object = JSONObject.parseObject(res);
if (object.containsKey(“result”)) {
JSONObject result = object.getJSONObject(“result”);
if (result.containsKey(“addressComponent”)) {
JSONObject address = object.getJSONObject(“result”).getJSONObject(“addressComponent”);
System.err.println(“拍摄地点:” + address.get(“country”) + " " + address.get(“province”) + " " + address.get(“city”) + " " + address.get(“district”) + " "
- address.get(“street”) + " " + result.get(“formatted_address”) + " " + result.get(“business”));
}
}
}
}
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
Ending
Tip:由于文章篇幅有限制,下面还有20个关于MySQL的问题,我都复盘整理成一份pdf文档了,后面的内容我就把剩下的问题的目录展示给大家看一下
如果觉得有帮助不妨【转发+点赞+关注】支持我,后续会为大家带来更多的技术类文章以及学习类文章!(阿里对MySQL底层实现以及索引实现问的很多)
吃透后这份pdf,你同样可以跟面试官侃侃而谈MySQL。其实像阿里p7岗位的需求也没那么难(但也不简单),扎实的Java基础+无短板知识面+对某几个开源技术有深度学习+阅读过源码+算法刷题,这一套下来p7岗差不多没什么问题,还是希望大家都能拿到高薪offer吧。
QL的问题,我都复盘整理成一份pdf文档了,后面的内容我就把剩下的问题的目录展示给大家看一下**
如果觉得有帮助不妨【转发+点赞+关注】支持我,后续会为大家带来更多的技术类文章以及学习类文章!(阿里对MySQL底层实现以及索引实现问的很多)
[外链图片转存中…(img-v0NPUrKh-1711195732615)]
[外链图片转存中…(img-oqzVBNpz-1711195732615)]
吃透后这份pdf,你同样可以跟面试官侃侃而谈MySQL。其实像阿里p7岗位的需求也没那么难(但也不简单),扎实的Java基础+无短板知识面+对某几个开源技术有深度学习+阅读过源码+算法刷题,这一套下来p7岗差不多没什么问题,还是希望大家都能拿到高薪offer吧。