通过Java提取照片中的拍摄时间及位置等信息
前置内容
既然我们要读取照片的信息,就要知道这些信息是什么,存储在什么文件格式中。
我们右击照片选择属性,点击详细信息
这些信息都是照片的EXIF信息,EXIF即exchangeable image file format:可交换图像文件格式,是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。
EXIF附加在jpeg等照片文件中
这些内容也叫做照片的元数据,我们可以通过metadata-extractor
来提取图片的元数据
开始操作
读取照片中的数据
-
给相机获取位置信息的权限,随便拍一张照片发送原图到电脑
-
创建maven项目引入metadata-extractor依赖
<dependency> <groupId>com.drewnoakes</groupId> <artifactId>metadata-extractor</artifactId> <version>2.18.0</version> </dependency>
-
new一个File
File file = new File("C:\\Users\\24983\\Desktop\\QQ图片20220824220329.jpg");
-
创建ImageMetadata对象进行读取,获取图片中的所有信息
Metadata metadata = ImageMetadataReader.readMetadata(file); System.out.println("---打印全部详情---"); //获取所有目录 Iterable<Directory> directories = metadata.getDirectories(); for (Directory directory : directories) { System.err.println("目录名:"+directory.getName()); //目录下的所有标签 Collection<Tag> tags = directory.getTags(); for (Tag tag : tags) { int tagType = tag.getTagType(); String tagName = tag.getTagName(); String description = tag.getDescription(); System.out.format("标签类型:%d=====标签名:%s====描述:%s\n",tagType,tagName,description); } System.err.println("*************************************"); }
-
读取常用信息
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); } } } /** * 经纬度格式转换为度分秒格式 ,如果需要的话可以调用该方法进行转换 * @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(); }
通过获取到的经纬度进行逆地址解析,获取详细地址
-
我是用的腾讯的api,所有需要先有一个腾讯的key
-
调用腾讯的逆地址解析服务
腾讯官网:https://lbs.qq.com/service/webService/webServiceGuide/webServiceGcoder -
此处要发起get请求
-
我用到的是httpClient
<dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> <version>3.1</version> </dependency>
-
/** * api_key:注册的腾讯api的key * 经纬度转地址信息 * @param gps_latitude 纬度 * @param gps_longitude 经度 */ private static void convertGpsToLoaction(double gps_latitude, double gps_longitude) throws IOException { String apiKey = "G62BZ-7D3CR-FB5WK-WEKCR-56IQF-FAF2S"; String url = "https://apis.map.qq.com/ws/geocoder/v1/?key=" + apiKey + "&output=json&location=" + (gps_latitude + "," + gps_longitude); System.err.println("【url】" + url); // 创建httpClient实例对象 HttpClient httpClient = new HttpClient(); // 设置httpClient连接主机服务器超时时间:15000毫秒 httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(15000); // 创建GET请求方法实例对象 GetMethod getMethod = new GetMethod(url); //设置get请求超时为6秒 getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 60000); //设置json格式传送 getMethod.addRequestHeader("Content-Type", "application/json"); // 通过客户端传入请求就可以发起请求,获取响应对象 int statusCode = httpClient.executeMethod(getMethod);//注意此处已经请求完成,返回访问状态码 //判断访问状态 if (statusCode != HttpStatus.SC_OK) { System.err.println("请求出错:" + getMethod.getStatusLine()); } //获取响应头 Header[] requestHeaders = getMethod.getResponseHeaders(); System.out.println("==============头信息================="); for (Header header : requestHeaders) { System.out.println(header.getName()+"==="+header.getValue()); } //获取响应体 String result = getMethod.getResponseBodyAsString(); //释放请求连接 getMethod.releaseConnection(); System.err.println(result); System.out.println("=============================================="); JSONObject object = JSONObject.parseObject(result); if (object.containsKey("result")) { JSONObject result1 = object.getJSONObject("result"); if (result1.containsKey("address_component")) { JSONObject address = object.getJSONObject("result").getJSONObject("address_component"); System.err.println("拍摄地点:" + address.get("nation") + " " + address.get("province") + " " + address.get("city") + " " + address.get("district") + " " + address.get("street")); } if (result1.containsKey("formatted_addresses")){ JSONObject jsonObject = object.getJSONObject("result").getJSONObject("formatted_addresses"); System.out.println("详细地址:"+jsonObject.get("recommend")); } } }
全部源码
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 org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
//import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
/**
* @Title:
* @Description TODO (照片信息提取)
* 创建人: 程长新
* 创建时间:2022/8/25 8:52
* @return
**/
public class ImgTestCode {
public static void main(String[] args) throws Exception {
File file = new File("C:\\Users\\24983\\Desktop\\QQ图片20220824220329.jpg");
readImageInfo(file);
}
/**
* 提取照片里面的信息(提取照片元数据)
* 读取照片宽高、经纬度、拍摄时间等信息
* 这些信息属于照片的EXIF(exchangeable image file format:可交换图像文件格式)信息,它被包含在JPEG、PNG等图像文件中
* EXIF包含很多信息
* 分辨率
* 文件类型
* F值/曝光时间/ISO
* 图像旋转
* 日期/时间
* 白平衡
* 缩略图
* 焦距
* 闪光
* 镜头
* 文件类型
* 相机类型
* 使用的软件
* 拍摄时间和GPS标签
* 等
* GPS标签中包含经纬度信息
* 通过经纬度进行逆地址解析就可以得到照片的拍摄地址
* @param file 照片文件
* @throws ImageProcessingException
* @throws Exception
*/
private static void readImageInfo(File file) throws ImageProcessingException, Exception {
Metadata metadata = ImageMetadataReader.readMetadata(file);
System.out.println("---打印全部详情---");
Iterable<Directory> directories = metadata.getDirectories();
for (Directory directory : directories) {
//所有目录
System.err.println("目录名:"+directory.getName());
//目录下的所有标签
Collection<Tag> tags = directory.getTags();
for (Tag tag : tags) {
int tagType = tag.getTagType();
String tagName = tag.getTagName();
String description = tag.getDescription();
System.out.format("标签类型:%d=====标签名:%s====描述:%s\n",tagType,tagName,description);
}
System.err.println("*************************************");
}
/*for (Directory directory : metadata.getDirectories()) {
for (Tag tag : directory.getTags()) {
//格式化输出[directory.getName()] - tag.getTagName() = tag.getDescription()
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(c) / 60 / 60;
return gps_dou;
}
/**
* api_key:注册的腾讯api的key
* 经纬度转地址信息
* @param gps_latitude 纬度
* @param gps_longitude 经度
*/
private static void convertGpsToLoaction(double gps_latitude, double gps_longitude) throws IOException {
String apiKey = "G62BZ-7D3CR-FB5WK-WEKCR-56IQF-FAF2S";
String url = "https://apis.map.qq.com/ws/geocoder/v1/?key=" + apiKey + "&output=json&location=" + (gps_latitude + "," + gps_longitude);
System.err.println("【url】" + url);
// 创建httpClient实例对象
HttpClient httpClient = new HttpClient();
// 设置httpClient连接主机服务器超时时间:15000毫秒
httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(15000);
// 创建GET请求方法实例对象
GetMethod getMethod = new GetMethod(url);
//设置get请求超时为6秒
getMethod.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 60000);
//设置json格式传送
getMethod.addRequestHeader("Content-Type", "application/json");
// 通过客户端传入请求就可以发起请求,获取响应对象
int statusCode = httpClient.executeMethod(getMethod);//注意此处已经请求完成,返回访问状态码
//判断访问状态
if (statusCode != HttpStatus.SC_OK) {
System.err.println("请求出错:" + getMethod.getStatusLine());
}
//获取响应头
Header[] requestHeaders = getMethod.getResponseHeaders();
System.out.println("==============头信息=================");
for (Header header : requestHeaders) {
System.out.println(header.getName()+"==="+header.getValue());
}
//获取响应体
String result = getMethod.getResponseBodyAsString();
//释放请求连接
getMethod.releaseConnection();
System.err.println(result);
System.out.println("==============================================");
JSONObject object = JSONObject.parseObject(result);
if (object.containsKey("result")) {
JSONObject result1 = object.getJSONObject("result");
if (result1.containsKey("address_component")) {
JSONObject address = object.getJSONObject("result").getJSONObject("address_component");
System.err.println("拍摄地点:" + address.get("nation") + " " + address.get("province") + " " + address.get("city") + " " + address.get("district") + " "
+ address.get("street"));
}
if (result1.containsKey("formatted_addresses")){
JSONObject jsonObject = object.getJSONObject("result").getJSONObject("formatted_addresses");
System.out.println("详细地址:"+jsonObject.get("recommend"));
}
}
}
}
输出结果
"C:\Program Files\Java\jdk1.8.0_271\bin\java.exe" "-javaagent:D:\Programming tool\IDEA\NewIdea\IntelliJ IDEA 2022.1.2\lib\idea_rt.jar=64361:D:\Programming tool\IDEA\NewIdea\IntelliJ IDEA 2022.1.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_271\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_271\jre\lib\rt.jar;D:\Programming tool\IDEA\workspace\MineProject\MineProject\target\test-classes;D:\Programming tool\IDEA\workspace\MineProject\MineProject\target\classes;D:\Programming tool\apache-maven-3.8.4\repository\org\apache\poi\poi\4.0.1\poi-4.0.1.jar;D:\Programming tool\apache-maven-3.8.4\repository\commons-codec\commons-codec\1.11\commons-codec-1.11.jar;D:\Programming tool\apache-maven-3.8.4\repository\org\apache\commons\commons-collections4\4.2\commons-collections4-4.2.jar;D:\Programming tool\apache-maven-3.8.4\repository\org\apache\commons\commons-math3\3.6.1\commons-math3-3.6.1.jar;D:\Programming tool\apache-maven-3.8.4\repository\org\apache\poi\poi-ooxml\4.0.1\poi-ooxml-4.0.1.jar;D:\Programming tool\apache-maven-3.8.4\repository\org\apache\poi\poi-ooxml-schemas\4.0.1\poi-ooxml-schemas-4.0.1.jar;D:\Programming tool\apache-maven-3.8.4\repository\org\apache\xmlbeans\xmlbeans\3.0.2\xmlbeans-3.0.2.jar;D:\Programming tool\apache-maven-3.8.4\repository\org\apache\commons\commons-compress\1.18\commons-compress-1.18.jar;D:\Programming tool\apache-maven-3.8.4\repository\com\github\virtuald\curvesapi\1.05\curvesapi-1.05.jar;D:\Programming tool\apache-maven-3.8.4\repository\junit\junit\4.13.1\junit-4.13.1.jar;D:\Programming tool\apache-maven-3.8.4\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;D:\Programming tool\apache-maven-3.8.4\repository\org\springframework\spring-context\5.0.5.RELEASE\spring-context-5.0.5.RELEASE.jar;D:\Programming tool\apache-maven-3.8.4\repository\org\springframework\spring-aop\5.0.5.RELEASE\spring-aop-5.0.5.RELEASE.jar;D:\Programming tool\apache-maven-3.8.4\repository\org\springframework\spring-beans\5.0.5.RELEASE\spring-beans-5.0.5.RELEASE.jar;D:\Programming tool\apache-maven-3.8.4\repository\org\springframework\spring-core\5.0.5.RELEASE\spring-core-5.0.5.RELEASE.jar;D:\Programming tool\apache-maven-3.8.4\repository\org\springframework\spring-jcl\5.0.5.RELEASE\spring-jcl-5.0.5.RELEASE.jar;D:\Programming tool\apache-maven-3.8.4\repository\org\springframework\spring-expression\5.0.5.RELEASE\spring-expression-5.0.5.RELEASE.jar;D:\Programming tool\apache-maven-3.8.4\repository\org\springframework\spring-webmvc\5.0.5.RELEASE\spring-webmvc-5.0.5.RELEASE.jar;D:\Programming tool\apache-maven-3.8.4\repository\org\springframework\spring-web\5.0.5.RELEASE\spring-web-5.0.5.RELEASE.jar;D:\Programming tool\apache-maven-3.8.4\repository\org\springframework\spring-tx\5.0.5.RELEASE\spring-tx-5.0.5.RELEASE.jar;D:\Programming tool\apache-maven-3.8.4\repository\org\aspectj\aspectjweaver\1.9.5\aspectjweaver-1.9.5.jar;D:\Programming tool\apache-maven-3.8.4\repository\org\springframework\spring-jdbc\5.0.5.RELEASE\spring-jdbc-5.0.5.RELEASE.jar;D:\Programming tool\apache-maven-3.8.4\repository\javax\servlet\javax.servlet-api\3.0.1\javax.servlet-api-3.0.1.jar;D:\Programming tool\apache-maven-3.8.4\repository\javax\servlet\jsp\javax.servlet.jsp-api\2.2.1\javax.servlet.jsp-api-2.2.1.jar;D:\Programming tool\apache-maven-3.8.4\repository\com\mchange\c3p0\0.9.5.2\c3p0-0.9.5.2.jar;D:\Programming tool\apache-maven-3.8.4\repository\com\mchange\mchange-commons-java\0.2.11\mchange-commons-java-0.2.11.jar;D:\Programming tool\apache-maven-3.8.4\repository\mysql\mysql-connector-java\5.1.32\mysql-connector-java-5.1.32.jar;D:\Programming tool\apache-maven-3.8.4\repository\org\mybatis\mybatis\3.5.3\mybatis-3.5.3.jar;D:\Programming tool\apache-maven-3.8.4\repository\org\mybatis\mybatis-spring\1.3.2\mybatis-spring-1.3.2.jar;D:\Programming tool\apache-maven-3.8.4\repository\com\fasterxml\jackson\core\jackson-databind\2.9.0\jackson-databind-2.9.0.jar;D:\Programming tool\apache-maven-3.8.4\repository\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;D:\Programming tool\apache-maven-3.8.4\repository\com\fasterxml\jackson\core\jackson-core\2.9.0\jackson-core-2.9.0.jar;D:\Programming tool\apache-maven-3.8.4\repository\com\drewnoakes\metadata-extractor\2.18.0\metadata-extractor-2.18.0.jar;D:\Programming tool\apache-maven-3.8.4\repository\com\adobe\xmp\xmpcore\6.1.11\xmpcore-6.1.11.jar;D:\Programming tool\apache-maven-3.8.4\repository\com\alibaba\fastjson\1.2.53\fastjson-1.2.53.jar;D:\Programming tool\apache-maven-3.8.4\repository\commons-httpclient\commons-httpclient\3.1\commons-httpclient-3.1.jar;D:\Programming tool\apache-maven-3.8.4\repository\commons-logging\commons-logging\1.0.4\commons-logging-1.0.4.jar" ImgTestCode
目录名:JPEG
标签类型:-3=====标签名:Compression Type====描述:Baseline
标签类型:0=====标签名:Data Precision====描述:8 bits
标签类型:1=====标签名:Image Height====描述:5120 pixels
标签类型:3=====标签名:Image Width====描述:3840 pixels
标签类型:5=====标签名:Number of Components====描述:3
标签类型:6=====标签名:Component 1====描述:Y component: Quantization table 0, Sampling factors 2 horiz/2 vert
标签类型:7=====标签名:Component 2====描述:Cb component: Quantization table 1, Sampling factors 1 horiz/1 vert
标签类型:8=====标签名:Component 3====描述:Cr component: Quantization table 1, Sampling factors 1 horiz/1 vert
标签类型:5=====标签名:Version====描述:1.1
标签类型:7=====标签名:Resolution Units====描述:inch
标签类型:8=====标签名:X Resolution====描述:96 dots
标签类型:10=====标签名:Y Resolution====描述:96 dots
标签类型:12=====标签名:Thumbnail Width Pixels====描述:0
标签类型:13=====标签名:Thumbnail Height Pixels====描述:0
标签类型:256=====标签名:Image Width====描述:3840 pixels
标签类型:257=====标签名:Image Height====描述:5120 pixels
标签类型:258=====标签名:Bits Per Sample====描述:8 8 8 bits/component/pixel
标签类型:271=====标签名:Make====描述:HUAWEI
标签类型:272=====标签名:Model====描述:VCE-AL00
标签类型:274=====标签名:Orientation====描述:Unknown (0)
标签类型:282=====标签名:X Resolution====描述:72 dots per inch
标签类型:283=====标签名:Y Resolution====描述:72 dots per inch
标签类型:296=====标签名:Resolution Unit====描述:Inch
标签类型:305=====标签名:Software====描述:VCE-AL00 10.0.0.171(C00E70R2P5)
标签类型:306=====标签名:Date/Time====描述:2022:08:22 15:44:27
标签类型:531=====标签名:YCbCr Positioning====描述:Center of pixel array
标签类型:41995=====标签名:Device Setting Description====描述:105 112 112 0
标签类型:269=====标签名:Document Name====描述:
标签类型:33434=====标签名:Exposure Time====描述:2127/500000 sec
标签类型:33437=====标签名:F-Number====描述:f/1.8
标签类型:34850=====标签名:Exposure Program====描述:Program normal
标签类型:34855=====标签名:ISO Speed Ratings====描述:50
标签类型:36864=====标签名:Exif Version====描述:2.10
标签类型:36867=====标签名:Date/Time Original====描述:2022:08:22 15:44:27
标签类型:36868=====标签名:Date/Time Digitized====描述:2022:08:22 15:44:27
标签类型:37121=====标签名:Components Configuration====描述:YCbCr
标签类型:37122=====标签名:Compressed Bits Per Pixel====描述:0.95 bits/pixel
标签类型:37377=====标签名:Shutter Speed Value====描述:1/999963864 sec
标签类型:37378=====标签名:Aperture Value====描述:f/1.8
标签类型:37379=====标签名:Brightness Value====描述:0.0
标签类型:37380=====标签名:Exposure Bias Value====描述:0 EV
标签类型:37381=====标签名:Max Aperture Value====描述:f/1.8
标签类型:37383=====标签名:Metering Mode====描述:Multi-segment
标签类型:37384=====标签名:White Balance====描述:Daylight
标签类型:37385=====标签名:Flash====描述:Flash did not fire
标签类型:37386=====标签名:Focal Length====描述:4 mm
标签类型:37500=====标签名:Makernote====描述:65 117 116 111 0
标签类型:37520=====标签名:Sub-Sec Time====描述:445137
标签类型:37521=====标签名:Sub-Sec Time Original====描述:445137
标签类型:37522=====标签名:Sub-Sec Time Digitized====描述:445137
标签类型:40960=====标签名:FlashPix Version====描述:1.00
标签类型:40961=====标签名:Color Space====描述:sRGB
标签类型:40962=====标签名:Exif Image Width====描述:3840 pixels
标签类型:40963=====标签名:Exif Image Height====描述:5120 pixels
标签类型:41495=====标签名:Sensing Method====描述:One-chip color area sensor
标签类型:41728=====标签名:File Source====描述:Digital Still Camera (DSC)
标签类型:41729=====标签名:Scene Type====描述:Directly photographed image
标签类型:41985=====标签名:Custom Rendered====描述:Custom process
标签类型:41986=====标签名:Exposure Mode====描述:Auto exposure
标签类型:41987=====标签名:White Balance Mode====描述:Auto white balance
标签类型:41988=====标签名:Digital Zoom Ratio====描述:1
标签类型:41989=====标签名:Focal Length 35====描述:27 mm
标签类型:41990=====标签名:Scene Capture Type====描述:Standard
标签类型:41991=====标签名:Gain Control====描述:None
标签类型:41992=====标签名:Contrast====描述:None
标签类型:41993=====标签名:Saturation====描述:None
标签类型:41994=====标签名:Sharpness====描述:None
标签类型:41996=====标签名:Subject Distance Range====描述:Unknown
标签类型:1=====标签名:Interoperability Index====描述:Recommended Exif Interoperability Rules (ExifR98)
标签类型:2=====标签名:Interoperability Version====描述:1.00
标签类型:0=====标签名:GPS Version ID====描述:2.200
标签类型:1=====标签名:GPS Latitude Ref====描述:N
标签类型:2=====标签名:GPS Latitude====描述:40° 15' 23.74"
标签类型:3=====标签名:GPS Longitude Ref====描述:E
*************************************
目录名:JFIF
*************************************
目录名:Exif IFD0
*************************************
目录名:Exif SubIFD
*************************************
目录名:Interoperability
*************************************
目录名:GPS
*************************************
目录名:Exif Thumbnail
*************************************
目录名:Huffman
*************************************
目录名:File Type
*************************************
目录名:File
*************************************
图片高度: 5120 pixels
图片宽度: 3840 pixels
图片宽度: 3840 pixels
图片高度: 5120 pixels
拍摄时间: 2022:08:22 15:44:27
纬度(度分秒格式) : 40° 15' 23.74"
纬度(十进制格式) : 40.256594444444445
经度(度分秒格式): 115° 30' 10.77"
经度(十进制格式): 115.50299166666667
图片宽度: 384 pixels
图片高度: 512 pixels
--经纬度转地址--
【url】https://apis.map.qq.com/ws/geocoder/v1/?key=G62BZ-7D3CR-FB5WK-WEKCR-56IQF-FAF2S&output=json&location=40.256594444444445,115.50299166666667
标签类型:4=====标签名:GPS Longitude====描述:115° 30' 10.77"
标签类型:5=====标签名:GPS Altitude Ref====描述:Below sea level
标签类型:6=====标签名:GPS Altitude====描述:0 metres
标签类型:7=====标签名:GPS Time-Stamp====描述:07:44:25.000 UTC
标签类型:27=====标签名:GPS Processing Method====描述:CELLID
标签类型:29=====标签名:GPS Date Stamp====描述:2022:08:22
标签类型:256=====标签名:Image Width====描述:384 pixels
标签类型:257=====标签名:Image Height====描述:512 pixels
标签类型:259=====标签名:Compression====描述:JPEG (old-style)
标签类型:274=====标签名:Orientation====描述:Unknown (0)
标签类型:282=====标签名:X Resolution====描述:72 dots per inch
标签类型:283=====标签名:Y Resolution====描述:72 dots per inch
标签类型:296=====标签名:Resolution Unit====描述:Inch
标签类型:513=====标签名:Thumbnail Offset====描述:8840 bytes
标签类型:514=====标签名:Thumbnail Length====描述:36093 bytes
标签类型:1=====标签名:Number of Tables====描述:4 Huffman tables
标签类型:1=====标签名:Detected File Type Name====描述:JPEG
标签类型:2=====标签名:Detected File Type Long Name====描述:Joint Photographic Experts Group
标签类型:3=====标签名:Detected MIME Type====描述:image/jpeg
标签类型:4=====标签名:Expected File Name Extension====描述:jpg
标签类型:1=====标签名:File Name====描述:QQ图片20220824220329.jpg
标签类型:2=====标签名:File Size====描述:6562630 bytes
标签类型:3=====标签名:File Modified Date====描述:星期三 八月 24 22:03:21 +08:00 2022
---打印全部详情---
--打印常用信息---
{
"status": 0,
"message": "query ok",
"request_id": "6990d546-3820-4ddf-be7b-cc27c33d8292",
"result": {
"location": {
"lat": 40.256594,
"lng": 115.502992
},
"address": "河北省张家口市怀来县",
"formatted_addresses": {
"recommend": "怀来县桑园镇南李官营",
"rough": "怀来县桑园镇南李官营"
},
"address_component": {
"nation": "中国",
"province": "河北省",
"city": "张家口市",
"district": "怀来县",
"street": "",
"street_number": ""
},
"ad_info": {
"nation_code": "156",
"adcode": "130730",
"city_code": "156130700",
"name": "中国,河北省,张家口市,怀来县",
"location": {
"lat": 40.415625,
"lng": 115.517868
},
"nation": "中国",
"province": "河北省",
"city": "张家口市",
"district": "怀来县"
},
"address_reference": {
"town": {
"id": "130730105",
"title": "桑园镇",
"location": {
"lat": 40.287274,
"lng": 115.542946
},
"_distance": 0,
"_dir_desc": "内"
},
"landmark_l2": {
"id": "7360123360737879486",
"title": "南李官营",
"location": {
"lat": 40.25686,
"lng": 115.49721
},
"_distance": 491.5,
"_dir_desc": "东"
}
}
}
}
==============================================
详细地址:怀来县桑园镇南李官营
拍摄地点:中国 河北省 张家口市 怀来县
进程已结束,退出代码0
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库