下面小编就为大家带来一篇 android 实现将位置信息写入 JPEG 图片文件。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
Android 是一种基于 Linux 的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由 Google 公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用 "安卓" 或 "安致"。
通过 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 - null
- 05-22 17:36:24.566: I/System.out(17966): Latitude - null
- 05-22 17:36:24.566: I/System.out(17966): Longitude Ref - null
- 05-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 - N
- 05-22 17:37:11.446: I/System.out(17966): Latitude - 39/1,14/1,4/1
- 05-22 17:37:11.446: I/System.out(17966): Longitude Ref - E
- 05-22 17:37:11.446: I/System.out(17966): Longitude - 116/1,7/1,24/1
以上这篇 android 实现将位置信息写入 JPEG 图片文件就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持 PHPERZ。
来源: http://www.phperz.com/article/17/0314/326168.html