手把手教你利用Java獲取圖片GPS信息
你知道的越多,不知道的就越多,業(yè)余的像一棵小草!
成功路上并不擁擠,因?yàn)閳?jiān)持的人不多。
編輯:業(yè)余草
推薦:https://www.xttblog.com/?p=5251
一張圖片能包含很多敏感信息,其中就包括圖片拍攝的 GPS 信息。GPS 對(duì)多數(shù)網(wǎng)民來說都不太注重,然而對(duì)于懂技術(shù)的程序員來說,根據(jù) GPS 信息,我們能準(zhǔn)確的定位到他們。
根據(jù)圖片上的 GSP 信息進(jìn)行定位,這對(duì)程序員來說是手到擒來。我們可以根據(jù)暗戀對(duì)象的朋友圈照片信息進(jìn)行簡(jiǎn)單處理,你就能和她來一次恰巧的相遇。下面我們就利用 Java 來讀取照片的拍攝時(shí)間、GPS 定位以及手機(jī)型號(hào)等等信息。
代碼很簡(jiǎn)單,幾行就能搞定。首先,我們先從某某美女群里下載美女所發(fā)的照片信息。

然后編寫 Java 代碼獲取圖片 GSP 等信息,核心代碼如下所示:
public?static?void?getGpsDirectory(String?filePath){
????File?picFile?=?getPicFile(filePath);
????getGpsDirectory(picFile);
}
public?static?void?getGpsDirectory(File?picFile){
????Metadata?metadata?=?getPicMetadata(picFile);
????GpsDirectory?gpsDirectory?=?metadata.getFirstDirectoryOfType(GpsDirectory.class);
????if?(Objects.nonNull(gpsDirectory))?{
????????GeoLocation?geoLocation?=?gpsDirectory.getGeoLocation();
????????System.out.println(geoLocation.getLongitude());
????????System.out.println(geoLocation.getLatitude());
????}
}
public?static?Metadata?getPicMetadata(File?picFile){
????Metadata?metadata?=?null;
????try(InputStream?inputStream?=?new?FileInputStream(picFile);
????????BufferedInputStream?bufferedInputStream?=?new?BufferedInputStream(inputStream))?{
????????FileType?fileType?=?FileTypeDetector.detectFileType(bufferedInputStream);
????????switch?(fileType)?{
????????????case?Png:
????????????????metadata?=?PngMetadataReader.readMetadata(picFile);
????????????????break;
????????????case?Jpeg:
????????????????metadata?=?JpegMetadataReader.readMetadata(picFile);
????????????????break;
????????????default:
????????????????return?metadata;
????????}
????}?catch?(Exception?e){
????????e.printStackTrace();
????}
????return?metadata;
}
public?static?void?main(String[]?args)?{
????getGpsDirectory("/Users/xtt/Downloads/業(yè)余草/美女照騙.jpeg");
}
根據(jù)上面的代碼,你運(yùn)行后就會(huì)獲得圖片的 GPS 信息。
24.41046111111111
103.41424722222223
然后訪問百度地圖 api(https://api.map.baidu.com/lbsapi/getpoint/),去根據(jù)經(jīng)緯度信息獲得照片的實(shí)際拍攝地址。
經(jīng)緯度查地址如果你需要批量操作,或者批量獲取地址信息,可以根據(jù)百度地圖或高德地圖提供的 api 去用代碼調(diào)用獲取。
//接口調(diào)用方法如下:
//api_key:是你注冊(cè)的key值
//coords:是你的經(jīng)緯度坐標(biāo)
?
http://api.map.baidu.com/reverse_geocoding/v3/?ak="+api_key+"&output=json&coordtype=wgs84ll&location="+coords
實(shí)際上根據(jù)一張未經(jīng)處理過的照片,我們能獲得想到對(duì)的信息。
{海拔=0 metres, 手機(jī)=Xiaomi, 緯度=24.41046111111111, 型號(hào)=MI MAX, 經(jīng)度=103.41424722222223, 拍攝時(shí)間=2018:12:01 16:37:32,
拍攝地點(diǎn)=中國(guó) 云南省 紅河哈尼族彝族自治州 彌勒市 XXX路 XXX號(hào) 溫泉XXXX酒店}
經(jīng)緯度:24.41046111111111,103.41424722222223
拍攝時(shí)間:2018:12:01 16:37:32
手機(jī)型號(hào):Xiaomi MI MAX
拍攝地點(diǎn):中國(guó) 云南省 紅河哈尼族彝族自治州 彌勒市 XXX路 XXX號(hào) 溫泉XXX酒店
{"status":0,"result":{"location":{"lng":103.42283328917563,"lat":24.413805252378915},
"formatted_address":"云南省紅河哈尼族彝族自治州彌勒市XXX路","business":"","addressComponent":
{"country":"中國(guó)","country_code":0,"country_code_iso":"CHN","country_code_iso2":"CN",
"province":"云南省","city":"紅河哈尼族彝族自治州","city_level":2,"district":"彌勒市","town":"","town_code":"","adcode":"532504","street":"溫泉路","street_number":"","direction":"","distance":""},"cityCode":107}}
上面還只是我們列舉的部分信息,這里面包含美女使用的手機(jī)型號(hào),拍攝時(shí)間,拍攝地址。。。

這些信息都是借助圖片的 Exif 獲得的。EXIF(Exchangeable Image File format)是“可交換圖像文件”的縮寫,當(dāng)中包含了專門為數(shù)碼相機(jī)的照片而定制的元數(shù)據(jù),可以記錄數(shù)碼照片的拍攝參數(shù)、縮略圖及其他屬性信息。
EXIF 所記錄的元數(shù)據(jù)信息非常豐富,主要包含了以下幾種信息:
- 拍攝日期
- 拍攝器材(機(jī)身、鏡頭、閃光燈等)
- 拍攝參數(shù)(快門速度、光圈F值、ISO速度、焦距、測(cè)光模式等)
- 圖像處理參數(shù)(銳化、對(duì)比度、飽和度、白平衡等)
- 圖像描述及版權(quán)信息
- GPS定位數(shù)據(jù)
- 縮略圖
[JPEG] Compression Type - Baseline
[JPEG] Data Precision - 8 bits
[JPEG] Image Height - 2400 pixels
[JPEG] Image Width - 3200 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 Thumbnail] Thumbnail Compression - JPEG (old-style)
[Exif Thumbnail] X Resolution - 72 dots per inch
[Exif Thumbnail] Y Resolution - 72 dots per inch
[Exif Thumbnail] Resolution Unit - Inch
[Exif Thumbnail] Thumbnail Offset - 4860 bytes
[Exif Thumbnail] Thumbnail Length - 26551 bytes
[Exif SubIFD] F-Number - f/2.4
[Exif SubIFD] Exif Version - 2.20
[Exif SubIFD] Date/Time Original - 2012:03:30 13:37:36
[Exif SubIFD] Components Configuration - YCbCr
[Exif SubIFD] Aperture Value - f/2.4
[Exif SubIFD] Focal Length - 4.31 mm
[Exif SubIFD] Makernote - 1
[Exif SubIFD] FlashPix Version - 1.00
[Exif SubIFD] Color Space - sRGB
[Exif SubIFD] Exif Image Width - 3200 pixels
[Exif SubIFD] Exif Image Height - 2400 pixels
[Exif SubIFD] Padding - [2060 bytes]
[Exif SubIFD] Unknown tag (0xea1d) - 0
[Xmp] XMP Value Count - 3
[Xmp] Rating - 4.0
[GPS] GPS Latitude Ref - N
[GPS] GPS Latitude - 37° 51' 42.54"
[GPS] GPS Longitude Ref - E
[GPS] GPS Longitude - 112° 34' 5.73"
[GPS] GPS Altitude Ref - Sea level
[GPS] GPS Altitude - 0 metres
[GPS] GPS Time-Stamp - 05:37:33.00 UTC
[GPS] GPS Processing Method - ASCII
[GPS] GPS Date Stamp - 2012:03:30
[Interoperability] Interoperability Version - 1.00
[Exif IFD0] Make - Xiaomi
[Exif IFD0] Model - mione_plus
[Exif IFD0] X Resolution - 72 dots per inch
[Exif IFD0] Y Resolution - 72 dots per inch
[Exif IFD0] Resolution Unit - Inch
[Exif IFD0] YCbCr Positioning - Center of pixel array
[Exif IFD0] Rating - 4
[Exif IFD0] Unknown tag (0x4749) - 75
[Exif IFD0] Padding - [2060 bytes]
[File] File Name - IMG_20120330_133736.jpg
[File] File Size - 4374893 bytes
[File] File Modified Date - Fri Mar 30 16:22:08 CST 2012
最后,我從程序員的角度勸告大家,在一些不知名的 APP 上,一定不要發(fā)送“原圖(原始圖片)信息”。最好是能夠進(jìn)行壓縮,轉(zhuǎn)碼,擦除照片圖片中的 Exif GPS 等隱私信息。但是也不要怕,對(duì)于微信、微博、淘寶等大廠來說,他們常用的 APP 都進(jìn)行了“隱私保護(hù)”。除非通過一些非常規(guī)手段,發(fā)送原圖,壓縮包等方式泄露個(gè)人信息。
感興趣的可以根據(jù)本文中的核心代碼自己動(dòng)手操作一遍,如果在實(shí)現(xiàn)起來有困難的,需要本文源碼的可以加我微信:codedq,或從這里下載獲?。篽ttps://download.csdn.net/download/xmt1139057136/20467387
