如何将位置信息写入JPEG图片文件【android】

通过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 := -79double 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 := 58coord = 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 := 55coord = 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

参考:

,人生不如意十之八-九,与其诅咒黑暗,倒不如在生命中点燃一盏灯

如何将位置信息写入JPEG图片文件【android】

相关文章:

你感兴趣的文章:

标签云: