当前位置: 代码迷 >> Android >> 怎么将位置信息写入JPEG图片文件【android】
  详细解决方案

怎么将位置信息写入JPEG图片文件【android】

热度:33   发布时间:2016-04-28 00:49:36.0
如何将位置信息写入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 := -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


参考:

http://blog.csdn.net/henry121212/article/details/17553719

http://blog.csdn.net/caiwenfeng_for_23/article/details/37706617



  相关解决方案