时间:2021-05-20
通过ExifInterface可以将拍照时的一些属性信息写入图片文件里,其中包括经纬度信息。本文介绍一种将经纬度坐标写入JPEG图片文件的方法!
核心代码
/*** 浮点型经纬度值转成度分秒格式* * @param coord* @return*/ public String decimalToDMS(double coord) { String output, degrees, minutes, seconds;// gets the modulus the coordinate divided by one (MOD1).// in other words gets all the numbers after the decimal point.// e.g. mod := -79.982195 % 1 == 0.982195//// next get the integer part of the coord. On other words the whole// number part.// e.g. intPart := -79 double mod = coord % 1; int intPart = (int) coord;// set degrees to the value of intPart// e.g. degrees := "-79" degrees = String.valueOf(intPart);// next times the MOD1 of degrees by 60 so we can find the integer part// for minutes.// get the MOD1 of the new coord to find the numbers after the decimal// point.// e.g. coord := 0.982195 * 60 == 58.9317// mod := 58.9317 % 1 == 0.9317//// next get the value of the integer part of the coord.// e.g. intPart := 58 coord = mod * 60; mod = coord % 1; intPart = (int) coord; if (intPart < 0) { // Convert number to positive if it's negative. intPart *= -1;}// set minutes to the value of intPart.// e.g. minutes = "58" minutes = String.valueOf(intPart);// do the same again for minutes// e.g. coord := 0.9317 * 60 == 55.902// e.g. intPart := 55 coord = mod * 60; intPart = (int) coord; if (intPart < 0) { // Convert number to positive if it's negative. intPart *= -1; }// set seconds to the value of intPart.// e.g. seconds = "55" seconds = String.valueOf(intPart);// I used this format for android but you can change it// to return in whatever format you like// e.g. output = "-79/1,58/1,56/1" output = degrees + "/1," + minutes + "/1," + seconds + "/1";// Standard output of D°M′S″// output = degrees + "°" + minutes + "'" + seconds + "\""; return output; }/*** 将经纬度信息写入JPEG图片文件里* * @param picPath* JPEG图片文件路径* @param dLat* 纬度* @param dLon* 经度*/ public void writeLatLonIntoJpeg(String picPath, double dLat, double dLon) { File file = new File(picPath); if (file.exists()) { try { ExifInterface exif = new ExifInterface(picPath); String tagLat = exif .getAttribute(ExifInterface.TAG_GPS_LATITUDE); String tagLon = exif .getAttribute(ExifInterface.TAG_GPS_LONGITUDE); if (tagLat == null && tagLon == null) // 无经纬度信息{ exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, decimalToDMS(dLat)); exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, dLat > 0 ? "N" : "S"); // 区分南北半球 exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, decimalToDMS(dLon)); exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, dLon > 0 ? "E" : "W"); // 区分东经西经 exif.saveAttributes();} } catch (Exception e) { }} }测试代码
String strImgPath = getImageCachePath() + File.separator + "1.jpg";ExifInterface eif = new ExifInterface(strImgPath);String lat = eif.getAttribute(ExifInterface.TAG_GPS_LATITUDE);String latRef = eif.getAttribute(ExifInterface.TAG_GPS_LATITUDE_REF);String lon = eif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE);String lonRef = eif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF);System.out.println("Latitude Ref - " + latRef);System.out.println("Latitude - " + lat);System.out.println("Longitude Ref - " + lonRef);System.out.println("Longitude - " + lon);if (lat == null && lon == null) // 没有位置信息才写入{ writeLatLonIntoJpeg(strImgPath, 39.23456, 116.123456);}第一次运行结果
05-22 17:36:24.566: I/System.out(17966): Latitude Ref - null05-22 17:36:24.566: I/System.out(17966): Latitude - null05-22 17:36:24.566: I/System.out(17966): Longitude Ref - null05-22 17:36:24.566: I/System.out(17966): Longitude - null原始图片没有位置信息,通过调用writeLatLonIntoJpeg(strImgPath, 39.23456, 116.123456)来模拟写入一个位置。
第二次运行结果
05-22 17:37:11.446: I/System.out(17966): Latitude Ref - N05-22 17:37:11.446: I/System.out(17966): Latitude - 39/1,14/1,4/105-22 17:37:11.446: I/System.out(17966): Longitude Ref - E05-22 17:37:11.446: I/System.out(17966): Longitude - 116/1,7/1,24/1以上这篇android实现将位置信息写入JPEG图片文件就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
1.动态权限申请模糊的位置信息android.permission.ACCESS_COARSE_LOCATION权限为例在AndroidManifest文件中加
链表的定义链表中的每个节点会存储相邻节点的位置信息,单链表中的每个节点只存储下一关节点的位置信息单向链表的实现classListNode:def__init__
本文实例讲述了php实现将数组或对象写入到文件的方法。分享给大家供大家参考,具体如下:php将数组或对象原样写入或保存到文件有三种方法可以实现第一种方法是使用s
本文实例讲述了C#实现将程序运行信息写入日志的方法。分享给大家供大家参考。具体如下:1.LogManager类classLogManager{staticobj
本文实例讲述了微信小程序学习笔记之获取位置信息操作。分享给大家供大家参考,具体如下:前面介绍了微信小程序文件上传、下载操作。这里分析一下获取位置信息操作。【获取