通過獲取圖片中的EXIF信息來定位拍攝地點

最近看見一篇報道“你與陌生人之間,可能只是一張照片的距離。有時候一張 “原圖”照片,分分鐘就暴露了你的信息……”。如今,任何智能手機拍攝的照片,都含有Exif參數,可以調用GPS全球定位系統數據,在照片中記錄下位置、時間等信息。當用戶把原始圖片發送給其他人時,所附帶的信息也一併發出去了。無論用微信、短信、郵件,抑或是其他傳輸工具,都是如此。
下面我們就來看看如何來獲取通過一張圖片來獲取拍攝地點:
  1. 使用metadata-extractor包實現圖片詳細信息提取。(主要是爲了獲取經緯度)
  2. 利用經緯度調用阿里雲地圖api來獲取地址信息。
  3. 利用alibaba封裝的fastjson來解析數據。
package com.kevin.method.file;

import java.io.File;
import java.net.URL;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
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;

public class GetPicProperties {
    public static void main(String[] args) throws Exception, Exception{  
         File file = new File("F:\\Pictures\\黃山行\\IMG_20170402_143927.jpg");  
         printImageTags(file);
     } 
     /** 
      * 讀取照片裏面的信息 
      */ 
     private static void printImageTags(File file) throws ImageProcessingException, Exception{  
         Metadata metadata = ImageMetadataReader.readMetadata(file);  
         String lat="";
         String log="";
         for (Directory directory : metadata.getDirectories()) {  
             for (Tag tag : directory.getTags()) { 
                 String tagName = tag.getTagName();  //標籤名
                 String desc = tag.getDescription(); //標籤信息
                 System.out.println(tagName+"   "+desc);//照片信息
                 if (tagName.equals("GPS Latitude")) {  
                      lat = pointToLatlong(desc);
                 } else if (tagName.equals("GPS Longitude")) {  
                      log = pointToLatlong(desc);
                 }

             }  
         }  
         String add = getAdd(log, lat);  
         JSONObject jsonObject = JSON.parseObject(add);
         JSONArray jsonArray = jsonObject.getJSONArray("addrList");
         JSONObject jso = jsonArray.getJSONObject(0);
         String allAdd = jso.getString("admName");  
         String arr[] = allAdd.split(",");  
         String adds = jso.getString("name");  
         System.out.println("省:"+arr[0]+"\n市:"+arr[1]+"\n區:"+arr[2]+"\n"+adds);
     }  
     /** 
      * 經緯度格式  轉換
      * @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 log 經度
      * @param lat 緯度
      * @return
      */
     public static String getAdd(String log, String lat ){  
         //參數解釋: 緯度,經度 type 001 (100代表道路,010代表POI,001代表門址,111可以同時顯示前三項)  
         String urlString = "http://gc.ditu.aliyun.com/regeocoding?l="+lat+","+log+"&type=010";  
         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());    
         }   
    //               System.out.println(res);  
         return res;    
     }  
}
//圖片裏的EXIF參數信息
Compression Type   Baseline
Data Precision   8 bits
Image Height   2340 pixels
Image Width   4160 pixels
Number of Components   3
Component 1   Y component: Quantization table 0, Sampling factors 2 horiz/2 vert
Component 2   Cb component: Quantization table 1, Sampling factors 1 horiz/1 vert
Component 3   Cr component: Quantization table 1, Sampling factors 1 horiz/1 vert
Exposure Time   1/1236 sec
F-Number   F2
Exposure Program   Unknown program (0)
ISO Speed Ratings   100
Exif Version   2.20
Date/Time Original   2017:04:02 14:39:27
Date/Time Digitized   2017:04:02 14:39:27
Components Configuration   YCbCr
Shutter Speed Value   1/1235 sec
Aperture Value   F2
Brightness Value   7.43
Metering Mode   Center weighted average
Flash   Flash did not fire, auto
Focal Length   4.12 mm
Sub-Sec Time   477109
Sub-Sec Time Original   477109
Sub-Sec Time Digitized   477109
FlashPix Version   1.00
Color Space   sRGB
Exif Image Width   4160 pixels
Exif Image Height   2340 pixels
Sensing Method   One-chip color area sensor
Scene Type   Directly photographed image
Exposure Mode   Auto exposure
White Balance Mode   Auto white balance
Focal Length 35   30mm
Scene Capture Type   Standard
Make   Xiaomi
Model   Mi-4c
X Resolution   72 dots per inch
Y Resolution   72 dots per inch
Resolution Unit   Inch
Software   libra-user 5.1.1 LMY47V V8.2.1.0.LXKCNDL release-keys
Date/Time   2017:04:02 14:39:27
YCbCr Positioning   Center of pixel array
Interoperability Index   Recommended Exif Interoperability Rules (ExifR98)
Interoperability Version   1.00
GPS Altitude Ref   Sea level
GPS Latitude Ref   N
GPS Latitude   29.0° 52.0' 3.24970000000377"
GPS Longitude Ref   E
GPS Longitude   118.0° 25.0' 49.81550000001107"
GPS Altitude   141 metres
GPS Time-Stamp   6:39:27 UTC
GPS Processing Method   ASCII
GPS Date Stamp   2017:04:02
Thumbnail Compression   JPEG (old-style)
X Resolution   72 dots per inch
Y Resolution   72 dots per inch
Resolution Unit   Inch
Thumbnail Offset   1052 bytes
Thumbnail Length   32357 bytes

//地址信息
省:安徽省
市:黃山市
區:歙縣
地址:朋悅旅館
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章