java获取图片的GPS信息

很简单,直接上代码

注意:通过微信发送的图片是获取不到GPS信息,我自己是通过usb上传测试的(打成压缩包传也可以)

引用依赖

<dependency>
     <groupId>com.drewnoakes</groupId>
     <artifactId>metadata-extractor</artifactId>
     <version>2.17.0</version>
</dependency>

获取图片的全部信息

public void fileGpsText2(){
        System.out.println("开始读取图片信息...");
        File jpegFile = new File("C:\\Users\\hp\\Desktop\\IMG_20220630_102607.jpg");
        Metadata metadata;
        try {
            metadata = JpegMetadataReader.readMetadata(jpegFile);
            Iterator<Directory> it = metadata.getDirectories().iterator();
            while (it.hasNext()) {
                Directory exif = it.next();
                Iterator<Tag> tags = exif.getTags().iterator();
                while (tags.hasNext()) {
                    Tag tag = (Tag) tags.next();
                    System.out.println(tag);
                }
            }
            System.out.println("图片信息读取完成!");
        } catch (JpegProcessingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

得到的结果
在这里插入图片描述
获取图片的经纬度,手机型号,拍摄时间,拍摄地址

@Test
    public void fileGpstext3(){
        File file = new File("C:\\Users\\hp\\Desktop\\IMG_20220630_102607.jpg");
        JSONObject jsonObject = getPosition(file);
        Map map = getAddress(jsonObject);

        String gps_longitude = jsonObject.getString("GPS Longitude");//经度
        String gps_latitude = jsonObject.getString("GPS Latitude");//纬度
        double longitude = transformPosition(gps_longitude);
        double latitude = transformPosition(gps_latitude);
        System.out.println("经度:"+longitude+"   纬度:"+latitude);
        System.out.println("手机型号:"+jsonObject.getString("Make")+"  "+jsonObject.getString("Model"));
        System.out.println("拍摄时间:"+jsonObject.getString("Date/Time"));
        System.out.println("拍摄地址:"+map.get("formatted_address")+" "+map.get("sematic_description"));
    }

    private static JSONObject getPosition(File file) {
        JSONObject jsonObject = new JSONObject();
        Metadata metadata = null;
        try {
            metadata = JpegMetadataReader.readMetadata(file);
            for (Directory directory : metadata.getDirectories()) {
                for (Tag tag : directory.getTags()) {
                    jsonObject.put(tag.getTagName(), tag.getDescription());
                }
            }
        } catch (JpegProcessingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return jsonObject;
    }

    /**
     * 经纬度转换
     * @param s
     * @return
     */
    private static double transformPosition(String s) {
        String a = s.split("°")[0].replace(" ", "");
        String b = s.split("°")[1].split("'")[0].replace(" ", "");
        String c = s.split("°")[1].split("'")[1].replace(" ", "").replace("\"", "");
        double gps_dou = Double.parseDouble(a)+Double.parseDouble(b)/60 + Double.parseDouble(c)/60/60;
        return gps_dou;
    }
    /**
     *  经纬度定位结果(百度地图)
     * @param
     * @param
     * @return
     */
    private static Map getAddress(JSONObject json) {
        String log = String.valueOf(transformPosition(json.getString("GPS Longitude")));//经度
        String lat = String.valueOf(transformPosition(json.getString("GPS Latitude")));//纬度
        String ak = "自己的百度应用ak";
        String urlString =
                "http://api.map.baidu.com/reverse_geocoding/v3/?ak=" + ak +
                        "&output=json&coordtype=wgs84ll&location=" + lat + "," + log;
        Map map = new LinkedHashMap();
        try {
            URL url = new URL(urlString);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();

            if (conn != null) {
                InputStreamReader inputStreamReader = new InputStreamReader(conn.getInputStream(), "UTF-8");
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                String data = null;
                if ((data = bufferedReader.readLine()) != null) {
                    JSONObject jsonObject = JSON.parseObject(data);
                    Object result = jsonObject.get("result");
                    map = JSONObject.parseObject(JSONObject.toJSONString(result), Map.class);
                }
                inputStreamReader.close();
            }
        } catch (Exception e) {
            System.out.println("error in wapaction,and e is " + e.getMessage());
        }
        return map;
    }

得到的结果

在这里插入图片描述
需要注意一点,根据经纬度去获取地址,需要输入自己的百度应用ak
如果没有根据这个地址去注册
最后在创建应用时需要勾选“地理编码”,不然会报错 {“status”:240,“message”:“APP 服务被禁用”}
在这里插入图片描述
最后补充一点,获取到的拍摄地址是通过经纬度去进行定位的,需要联网,如果没有网的话是获取不到位置的,会是null

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中读取图片GPS信息可以使用第三方库javax.imageio和com.drew.metadata.exif,下面是一种实现方法: 首先,需要导入这两个库的依赖。 使用javax.imageio库的ImageIO类的静态方法read可以读取图片文件,并返回一个BufferedImage对象,例如: ``` BufferedImage image = ImageIO.read(new File("image.jpg")); ``` 接下来,使用com.drew.metadata.exif库的ExifReader类的静态方法read可以读取这个BufferedImage对象中的EXIF(Exchangeable Image File Format)元数据,例如: ``` Metadata metadata = ExifReader.readMetadata(image); ``` 然后,从读取的元数据中可以获取图片GPS信息。首先,使用com.drew.metadata.exif的ExifIFD0Directory类的静态方法containsTag可以判断元数据中是否包含GPS信息的标签,例如: ``` if (metadata.containsDirectory(GpsDirectory.class)) { // 元数据中存在GPS信息的标签 } ``` 如果存在GPS信息的标签,可以使用com.drew.metadata.exif的GpsDirectory类的静态方法getGpsLatitude、getGpsLongitude、getGpsAltitude等可以获取相应的GPS信息,例如: ``` if (metadata.containsDirectory(GpsDirectory.class)) { GpsDirectory gpsDirectory = metadata.getFirstDirectoryOfType(GpsDirectory.class); GeoLocation geoLocation = gpsDirectory.getGeoLocation(); double latitude = geoLocation.getLatitude(); double longitude = geoLocation.getLongitude(); double altitude = geoLocation.getAltitude(); // 使用获取到的GPS信息进行相关操作 } ``` 最后,根据获取到的GPS信息进行相应的操作,例如可以将经纬度、海拔等信息进行输出或者进行其他处理。 需要注意的是,这里提到的库只是其中一种实现方法,还有其他库和实现方式可以实现读取图片GPS信息,具体实现方式可以根据具体需求自行选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值