如何将位置信息写入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 - 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


参考:

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

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



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。