<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          牛逼了!通過 Java 技術手段,把女朋友定位了...

          共 10006字,需瀏覽 21分鐘

           ·

          2021-11-16 02:58

          點擊上方藍色字體,選擇“標星公眾號”

          優(yōu)質文章,第一時間送達

          今早,看到CSDN里推薦的Python獲取女朋友發(fā)來加班拍照定位地址是酒店的段子,本來準備驗證下,順便練練手的,最后,安裝執(zhí)行pip install json報沒有指定版本號。

          一怒之下搞我大JAVA,驗證可行與場景體遐想。廢話不多說,先上硬貨。

          依賴導入

          從博文上看是exifread模塊,找我大java的對應的jar,發(fā)現(xiàn)metadata-extractor,而且官方還在持續(xù)更新,最近的jar是今年的。

          在這里插入圖片描述

          這個元數(shù)據(jù)提取jar非常強大,還支持視頻信息的提取,看看官方介紹:

          在這里插入圖片描述

          看到?jīng)],第一個示例,就寫的支持我大JAVA,讓我猶如雞血沖頂,在支持同事聯(lián)調事件工單的同時,大肝這塊。


          ????com.drewnoakes
          ????metadata-extractor
          ????2.16.0

          準備工作

          1、室外空曠地點打開GPS

          2、百度地圖、北斗伴驗證已連接到GPS定位

          在這里插入圖片描述
          在這里插入圖片描述

          3、設置手機帶的照相機開啟位置信息

          在這里插入圖片描述
          在這里插入圖片描述

          4、拍照一張順便查看照片詳情

          在這里插入圖片描述

          這里一定要確定拍的照片的詳情時有經(jīng)緯度信息的,如果沒有,你針對你的手機在CSDN里搜索下怎么設置。這里順便提下,CSDN的瀏覽器插件真香。簡直就是我們技術人事的福音,再以不用擔心某某度的廣告之類導致找東西費勁了,而且它很包容,還時可以選擇自己喜歡的搜索引擎的。

          在這里插入圖片描述

          示例demo

          這里先演示這個元數(shù)據(jù)提取jar能提取到的信息,順便把取到的經(jīng)緯度通過百度轉地址。

          因為是demo,沒有業(yè)務,我這里就直接在測試類里干了。沒有什么業(yè)務,不涉及什么機密,可以上全碼。

          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("經(jīng)度:?"?+?desc);
          ????????????????????System.err.println("經(jīng)度(度分秒格式):?"?+?pointToLatlong(desc));
          ????????????????????lng?=?latLng2Decimal(desc);
          ????????????????}
          ????????????}
          ????????}
          ????????System.err.println("--經(jīng)緯度轉地址--");
          ????????//經(jīng)緯度轉地主使用百度api
          ????????convertGpsToLoaction(lat,?lng);


          ????}

          ????/**
          ?????*?經(jīng)緯度格式??轉換為??度分秒格式?,如果需要的話可以調用該方法進行轉換
          ?????*
          ?????*?@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();
          ????}

          ????/***
          ?????*?經(jīng)緯度坐標格式轉換(*?°轉十進制格式)
          ?????*?@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
          ?????* coords:經(jīng)緯度坐標
          ?????*?http://api.map.baidu.com/reverse_geocoding/v3/?ak="+api_key+"&output=json&coordtype=wgs84ll&location="+coords
          ?????*?


          ?????*?經(jīng)緯度轉地址信息
          ?????*
          ?????*?@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"));
          ????????????}
          ????????}
          ????}

          }

          控制臺打印:

          在這里插入圖片描述

          下面貼出詳細內容:

          com.easylinkin.bm.extractor.ImgTestCode
          ---打印全部詳情---
          [JPEG]?-?Compression?Type?=?Baseline
          [JPEG]?-?Data?Precision?=?8?bits
          [JPEG]?-?Image?Height?=?4032?pixels
          [JPEG]?-?Image?Width?=?3024?pixels
          [JPEG]?-?Number?of?Components?=?3
          [JPEG]?-?Component?1?=?Y?component:?Quantization?table?0,?Sampling?factors?2?horiz/2?vert
          [JPEG]?-?Component?2?=?Cb?component:?Quantization?table?1,?Sampling?factors?1?horiz/1?vert
          [JPEG]?-?Component?3?=?Cr?component:?Quantization?table?1,?Sampling?factors?1?horiz/1?vert
          [Exif?IFD0]?-?Date/Time?=?2021:08:20?09:39:58
          [Exif?IFD0]?-?Model?=?YOTA?Y3
          [Exif?IFD0]?-?YCbCr?Positioning?=?Center?of?pixel?array
          [Exif?IFD0]?-?Resolution?Unit?=?Inch
          [Exif?IFD0]?-?Y?Resolution?=?72?dots?per?inch
          [Exif?IFD0]?-?X?Resolution?=?72?dots?per?inch
          [Exif?IFD0]?-?Make?=?YOTA
          [GPS]?-?GPS?Date?Stamp?=?2021:08:20
          [GPS]?-?GPS?Altitude?Ref?=?Below?sea?level
          [GPS]?-?GPS?Longitude?Ref?=?E
          [GPS]?-?GPS?Longitude?=?114°?24'?9.61"
          [GPS]?-?GPS?Processing?Method?=?ASCII
          [GPS]?-?GPS?Latitude?Ref?=?N
          [GPS]?-?GPS?Time-Stamp?=?01:39:46.000?UTC
          [GPS]?-?GPS?Altitude?=?21?metres
          [GPS]?-?GPS?Latitude?=?30°?28'
          ?40.67"
          [Exif?SubIFD]?-?Color?Space?=?sRGB
          [Exif?SubIFD]?-?F-Number?=?f/1.9
          [Exif?SubIFD]?-?Date/Time?Digitized?=?2021:08:20?09:39:58
          [Exif?SubIFD]?-?Focal?Length?=?3.9?mm
          [Exif?SubIFD]?-?Aperture?Value?=?f/1.9
          [Exif?SubIFD]?-?Exposure?Mode?=?Auto?exposure
          [Exif?SubIFD]?-?Sub-Sec?Time?Digitized?=?819350
          [Exif?SubIFD]?-?Exif?Image?Height?=?4032?pixels
          [Exif?SubIFD]?-?Focal?Length?35?=?23?mm
          [Exif?SubIFD]?-?Scene?Capture?Type?=?Standard
          [Exif?SubIFD]?-?Sub-Sec?Time?Original?=?819350
          [Exif?SubIFD]?-?Exposure?Program?=?Unknown?(0)
          [Exif?SubIFD]?-?White?Balance?Mode?=?Auto?white?balance
          [Exif?SubIFD]?-?Exif?Image?Width?=?3024?pixels
          [Exif?SubIFD]?-?Sub-Sec?Time?=?819350
          [Exif?SubIFD]?-?Shutter?Speed?Value?=?1/1022?sec
          [Exif?SubIFD]?-?Metering?Mode?=?Center?weighted?average
          [Exif?SubIFD]?-?Date/Time?Original?=?2021:08:20?09:39:58
          [Exif?SubIFD]?-?Components?Configuration?=?YCbCr
          [Exif?SubIFD]?-?Exif?Version?=?2.20
          [Exif?SubIFD]?-?Flash?=?Flash?did?not?fire
          [Exif?SubIFD]?-?Brightness?Value?=?0.0
          [Exif?SubIFD]?-?ISO?Speed?Ratings?=?103
          [Exif?SubIFD]?-?Sensing?Method?=?One-chip?color?area?sensor
          [Exif?SubIFD]?-?FlashPix?Version?=?1.00
          [Exif?SubIFD]?-?Exposure?Time?=?1/1023?sec
          [Interoperability]?-?Interoperability?Index?=?Recommended?Exif?Interoperability?Rules?(ExifR98)
          [Interoperability]?-?Interoperability?Version?=?1.00
          [Exif?Thumbnail]?-?Y?Resolution?=?72?dots?per?inch
          [Exif?Thumbnail]?-?Thumbnail?Length?=?21538?bytes
          [Exif?Thumbnail]?-?Thumbnail?Offset?=?959?bytes
          [Exif?Thumbnail]?-?Compression?=?JPEG?(old-style)
          [Exif?Thumbnail]?-?Resolution?Unit?=?Inch
          [Exif?Thumbnail]?-?X?Resolution?=?72?dots?per?inch
          [Huffman]?-?Number?of?Tables?=?4?Huffman?tables
          [File?Type]?-?Detected?File?Type?Name?=?JPEG
          [File?Type]?-?Detected?File?Type?Long?Name?=?Joint?Photographic?Experts?Group
          [File?Type]?-?Detected?MIME?Type?=?image/jpeg
          [File?Type]?-?Expected?File?Name?Extension?=?jpg
          [File]?-?File?Name?=?IMG_20210820_093958.jpg
          [File]?-?File?Size?=?5215044?bytes
          [File]?-?File?Modified?Date?=?星期五?八月?20?09:39:59?+08:00?2021
          --打印常用信息---
          初始化HttpClientTest~~~開始
          圖片高度:?4032?pixels
          圖片寬度:?3024?pixels
          經(jīng)度:?114°?24'?9.61"

          經(jīng)度(度分秒格式):?114.40266944444446
          緯度?:?30°?28'?40.67"
          緯度(度分秒格式)?:?30.477963888888887
          拍攝時間:?2021:08:20?09:39:58
          --經(jīng)緯度轉地址--
          【url】http://api.map.baidu.com/reverse_geocoding/v3/?ak=YNxcSCAphFvuPD4LwcgWXwC3SEZZc7Ra&output=json&coordtype=wgs84ll&location=30.477963888888887,114.40266944444446
          初始化HttpClientTest~~~結束
          拍攝地點:中國?湖北省?武漢市?洪山區(qū)?軟件園路?湖北省武漢市洪山區(qū)軟件園路9 關山,光谷天地

          上面的提取到的內容我就不解釋了,應該看得懂,不懂的,可以翻譯英文,或者查API看打印的是啥。其他文件我就不演示了,有興趣的可以自己試試。我的百度地圖的AK就先放這里,方便大家驗證,免得說我騙人,反正我也是免費用的。最后再說一句,圖片發(fā)送要么壓縮到壓縮包再發(fā)送,要么用數(shù)據(jù)線從手機里拷出來。我這里先用微信發(fā)的,基本上信息都被抹除了(在電腦上查看圖片詳情,其實也可以看到經(jīng)緯度信息的)。還有,我還有個蘋果手機,其實也是可以拍有地理位置信息的照片的,要打開隱私里的定位,授權照相機。

          總結與衍生想法

          這個怎么說呢,還是很不錯的。用到我們的工作中的話,我們覺得可以替代我們之前做的一個打點巡檢的,到達巡檢位置拍張照片再配合機器碼,不怕你讓別人代拍照片了。還有考勤的公出單、外勤等等。

          另外還想到這出門在外愛拍照的娃們,你們的照片放到云存儲上,然后如果有無良服務商,基本可以把你的軌跡通過你上傳的照片時間繪制出來。。。

          好了,這個就分享到這里。這里其實還給我一個最大的感受就是,如果我不知道A就不會想到B。要是我早知道圖片可以攜帶的信息,或者知道照相機軟件可以獲取的信息,可能可以針對這些早點做點什么。。。。。。


          ? 作者?|??肥仔哥哥1930

          來源 |??blog.csdn.net/zwrlj527/article/details/119823407

          瀏覽 71
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色在线观看国产高清 | 色色色五月天婷婷 | 逼国产| 日本黄色视频网 | 美国黑人大屌视频 |