Java基础、中级、高级、架构面试资料

业余草手把手教你利用Java获取图片GPS信息

JAVA herman 2645浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云

一张图片能包含很多敏感信息,其中就包括图片拍摄的 GPS 信息。GPS 对多数网民来说都不太注重,然而对于懂技术的程序员来说,根据 GPS 信息,我们能准确的定位到他们。

根据图片上的 GSP 信息进行定位,这对程序员来说是手到擒来。我们可以根据暗恋对象的朋友圈照片信息进行简单处理,你就能和她来一次恰巧的相遇。下面我们就利用 Java 来读取照片的拍摄时间、GPS 定位以及手机型号等等信息。

代码很简单,几行就能搞定。首先,我们先从某某美女群里下载美女所发的照片信息。

美女照骗
美女照骗

然后编写 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/业余草/美女照骗.jpeg");
}

根据上面的代码,你运行后就会获得图片的 GPS 信息。

24.41046111111111
103.41424722222223

然后访问百度地图 api(https://api.map.baidu.com/lbsapi/getpoint/),去根据经纬度信息获得照片的实际拍摄地址。

经纬度查地址
经纬度查地址

如果你需要批量操作,或者批量获取地址信息,可以根据百度地图或高德地图提供的 api 去用代码调用获取。

//接口调用方法如下:
//api_key:是你注册的key值
//coords:是你的经纬度坐标
 
http://api.map.baidu.com/reverse_geocoding/v3/?ak="+api_key+"&output=json&coordtype=wgs84ll&location="+coords

实际上根据一张未经处理过的照片,我们能获得想到对的信息。

{海拔=0 metres, 手机=Xiaomi, 纬度=24.41046111111111, 型号=MI MAX, 经度=103.41424722222223, 拍摄时间=2018:12:01 16:37:32, 
拍摄地点=中国  云南省 红河哈尼族彝族自治州 弥勒市 XXX路 XXX号 温泉XXXX酒店}
经纬度:24.41046111111111,103.41424722222223
拍摄时间:2018:12:01 16:37:32
手机型号:Xiaomi MI MAX
拍摄地点:中国  云南省 红河哈尼族彝族自治州 弥勒市 XXX路 XXX号 温泉XXX酒店
{"status":0,"result":{"location":{"lng":103.42283328917563,"lat":24.413805252378915},
"formatted_address":"云南省红河哈尼族彝族自治州弥勒市XXX路","business":"","addressComponent":
{"country":"中国","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}}

上面还只是我们列举的部分信息,这里面包含美女使用的手机型号,拍摄时间,拍摄地址。。。

照片Exif信息
照片Exif信息

这些信息都是借助图片的 Exif 获得的。EXIF(Exchangeable Image File format)是“可交换图像文件”的缩写,当中包含了专门为数码相机的照片而定制的元数据,可以记录数码照片的拍摄参数、缩略图及其他属性信息。

EXIF 所记录的元数据信息非常丰富,主要包含了以下几种信息:

  • 拍摄日期
  • 拍摄器材(机身、镜头、闪光灯等)
  • 拍摄参数(快门速度、光圈F值、ISO速度、焦距、测光模式等)
  • 图像处理参数(锐化、对比度、饱和度、白平衡等)
  • 图像描述及版权信息
  • GPS定位数据
  • 缩略图
[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 上,一定不要发送“原图(原始图片)信息”。最好是能够进行压缩,转码,擦除照片图片中的 Exif GPS 等隐私信息。但是也不要怕,对于微信、微博、淘宝等大厂来说,他们常用的 APP 都进行了“隐私保护”。除非通过一些非常规手段,发送原图,压缩包等方式泄露个人信息。

感兴趣的可以根据本文中的核心代码自己动手操作一遍,如果在实现起来有困难的,需要本文源码的可以加我微信:codedq,或从这里下载获取:Java读取照片地址、GPS信息、定位照片精确位置完整项目【附测试照片一张】.zip

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » 业余草手把手教你利用Java获取图片GPS信息