Java获取图片的拍摄地理位置
准备
1,在手机的相机里面设置打开位置信息,然后拍摄一张图片备用。
2,将手机拍摄的图片上传到电脑上面,需要注意的是微信,QQ接收的话需要先压缩图片然后在发送(防止图片信息发生变化)。
3,创建springboot项目,jdk8,idea,电脑联网状态(这里解析经纬度是通过百度的api)。
直接上代码
依赖引入
<dependency><groupId>com.drewnoakes</groupId><artifactId>metadata-extractor</artifactId><version>2.16.0</version>
</dependency>
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.53</version>
</dependency>
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.10</version><scope>provided</scope>
</dependency>
GpsUtile工具类
经纬度格式化
/*** @author lipeng* @date 2021/11/4 10:56*/
public class GpsUtil {/*** 经纬度格式 转换为 度分秒格式** @param point 坐标点* @return duStr*/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* @return gps_dou*/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(c) / 60 / 60;return gps_dou;}
}
ImgUtil类
文件详细信息读取
经纬度解析成详细地址
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 java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
/*** @author lipeng* @date 2021/11/4 10:26*/
public class ImgUtil {// 读取图片的全部信息public static void readImgAll(File file) throws ImageProcessingException, IOException {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);}}}}// 读取图片的常用信息,并将信息封装到集合里面public static Map readImgNormal(File file) throws ImageProcessingException, IOException {Metadata metadata = ImageMetadataReader.readMetadata(file);Map<String,String> map = new HashMap<>();for (Directory directory : metadata.getDirectories()) {for (Tag tag : directory.getTags()) {String tagName = tag.getTagName(); //标签名String desc = tag.getDescription(); //标签信息if (tagName.equals("Image Height")) {map.put("imgHeigh" , desc);} else if (tagName.equals("Image Width")) {map.put("imgWeith" , desc);} else if (tagName.equals("Date/Time Original")) {map.put("time" , desc);} else if (tagName.equals("GPS Latitude")) {map.put("lat" , GpsUtil.pointToLatlong(desc));} else if (tagName.equals("GPS Longitude")) {map.put("log" , GpsUtil.pointToLatlong(desc));}}}return map;}/*** api_key:注册的百度api的key* coords:经纬度坐标* http://api.map.baidu.com/reverse_geocoding/v3/?ak="+api_key+"&output=json&coordtype=wgs84ll&location="+coords* <p>* 经纬度转地址信息** @param lat 维度* @param log 精度* @return add 地址*/public static Map parseAdd(String log, String lat) throws IOException {Map<String,String> adress = new HashMap<>();String apiKey = "YNxcSCAphFvuPD4LwcgWXwC3SEZZc7Ra";//lat 小 log 大//参数解释: 纬度,经度 type 001 (100代表道路,010代表POI,001代表门址,111可以同时显示前三项)String urlString = "http://api.map.baidu.com/reverse_geocoding/v3/?ak=" + apiKey + "&output=json&coordtype=wgs84ll&location=" + (lat + "," + log);String res = "";try {URL url = new URL(urlString);java.net.HttpURLConnection conn = (java.net.HttpURLConnection)url.openConnection();conn.setDoOutput(true);conn.setRequestMethod("POST");java.io.BufferedReader in = new java.io.BufferedReader(new java.io.InputStreamReader(conn.getInputStream(),"UTF-8"));String line;while ((line = in.readLine()) != null) {res += line+"\n";}in.close();} catch (Exception e) {System.out.println("error in wapaction,and e is " + e.getMessage());}JSONObject object = JSONObject.parseObject(res);if (object.containsKey("result")) {JSONObject result = object.getJSONObject("result");if (result.containsKey("addressComponent")) {JSONObject addressObj = object.getJSONObject("result").getJSONObject("addressComponent");adress.put("country", (String) addressObj.get("country"));adress.put("province", (String) addressObj.get("province"));adress.put("city", (String) addressObj.get("city"));adress.put("district", (String) addressObj.get("district"));adress.put("street", (String) addressObj.get("street"));}}else {adress = null;}return adress;}// 将图片里面的经纬度通过百度地图的api解析成详细的地址public static Map parseAddByImg(File file) throws ImageProcessingException, IOException {Map map = readImgNormal(file);String lat = (String) map.get("lat");String log = (String) map.get("log");return parseAdd(log,lat);}
}
测试
import com.drew.imaging.ImageProcessingException;
import com.lp.img_gps.util.ImgUtil;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.util.Map;
/*** @author lipeng* @date 2021/11/4 10:53*/
public class ImgTest {private File file = new File("C:\\Users\\TY\\Desktop\\daskImage\\临时\\test.jpg");@Testpublic void readImgAllTest() throws ImageProcessingException, IOException {ImgUtil.readImgAll(file);}@Testpublic void readImgNormalTest() throws ImageProcessingException, IOException {Map map = ImgUtil.readImgNormal(file);System.out.println(map);}@Testpublic void parseAdd() throws IOException {Map add = ImgUtil.parseAdd("116.3039", "39.97646");System.out.println(add);}@Testpublic void parseAddByImg() throws ImageProcessingException, IOException {Map add = ImgUtil.parseAddByImg(file);System.out.println(add);}
}
Java获取图片的拍摄地理位置相关推荐
- JAVA获取图片的宽、高和大小
JAVA获取图片的宽.高.大小 如果是本地磁盘文件 File file = new File("C:\\Users\\root\\Desktop\\test.jpg");Buffe ...
- java获取图片的长宽尺寸(毫米)
java获取图片的长宽尺寸(毫米) 现在有个需求是附上 附件图片,同时要标注图片的一些属性,比较麻烦的要标识图片的长宽尺寸(毫米),网上找了半天都是获取图片的长宽像素,但是想了想 图片的长宽尺寸不应该 ...
- java 图片宽高_[Java]获取图片高和宽
通过javax.imageio.ImageIO类中的read()函数读取的图片,存放在类java.awt.image.BufferedImage类中.调用BufferedImage类中的getWidt ...
- java获取图片的大小和尺寸(本地 服务器)
java获取图片的大小和尺寸,有两种获取的源,一种是读取本地的图片获取大小和尺寸,一种是通过服务器上图片的地址获取图片的尺寸!下面整理出这两种方式的简易代码,希望帮助的大家和自己! 我使用的Juint ...
- java 获取图片的宽高
博客引用处(以下内容在原有博客基础上进行补充或更改,谢谢这些大牛的博客指导): 通过java获取图片的宽高 获取本地文件的图片尺寸: import java.awt.image.BufferedIma ...
- Java获取图片||图标
一:java获取图标 图标:大小小,不占大部分内存,用于Swing组件类,按键旁,表格里,加以修饰形容,达到使得界面更美观的效果 public static Icon getIcon(String n ...
- Java获取图片的RGB值(数字图像处理)
Java获取图片的RGB值(数字图像处理) 一:简介 RGB即是代表红.绿.蓝三个通道的颜色.我们知道大多数的颜色都是由这3种颜色所组成,下面我们将演示使用Java获取到图片中的RGB值,并且输出: ...
- 手把手教你利用Java获取图片GPS信息
你知道的越多,不知道的就越多,业余的像一棵小草! 成功路上并不拥挤,因为坚持的人不多. 编辑:业余草 推荐:https://www.xttblog.com/?p=5251 一张图片能包含很多敏感信息, ...
- Java获取图片RGB值
前言 图片对比获取坐标的方法很多,我选择了比较简单的方法:对比rgb值.要想对比rgb值,就得先获取图片的rgb值.运用的是BufferedImage里的getRGNB方法. 解决方案 首先用.get ...
最新文章
- 使用Dom4j操作XML数据
- 明明表中有这个索引,但mysql的force index 无效?
- http 请求 与其同步与异步请求的通透讲解
- oracle排名怎么去除空值影响,Oracle排序中常用的NULL值处理方法
- oracle在日本遇到的技术问题
- spring boot 使用application.properties 进行外部配置
- Nowcoder 提高组练习赛-R2
- 程序流程图N-S图PAD图
- 【MVC 4】4.MVC 基本工具(Visual Studio 的单元测试、使用Moq)
- Android源码文件夹结构
- HTTP Header中的内容(请求Header、响应Header)
- 数学建模之线性规划问题(含整数规划和0-1规划)
- 最严谨的计算机语言p,一款全新的 高级PLC编程语言 P语言 简介-专业自动化论坛-中国工控网论坛...
- 认认真真推荐几个清华学霸的公众号!
- 10分钟搞定miniconda-python环境安装
- 软件项目测试流程的规划
- UEdit 使用总结
- 漏洞修复需要升级打补丁,打补丁准备工作
- 【微搭低代码】美业小程序官方模板练习-绘制原型
- 刷题记录——动态规划