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

时间: 2024-10-22 16:08:21

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

一些浏览器智能翻转图片,php判断并复制(覆盖)带有Orientation图片翻转信息的JPEG图片

/** * 处理带有Orientation图片翻转信息的JPEG图片 * param $imagePath 图片资源路径 * param $dscPath 目标路径 * 照片中EXIF Orientation 参数让你随便照像但都可以看到正确方向的照片而无需手动旋转(前提要图片浏览器支持,Windows 自带的不支持) * * */public static function delImgOrientation($imagePath, $dscPath = null){ /* exif_imag

Android ImageView 不显示JPEG图片 及 Android Studio中如何引用图片资源

Android ImageView 不显示JPEG图片 今天在写一个小实例,ImageView在xml里面设置的是INVISIBLE,在代码里需要设置成setVisibility(View.VISIBLE),但图片没有显示出来,换成PNG或其它的JPEG格式的图片确可以正常的显示. 原因:显示的图片大小为5.39K,图片格式有损坏,所以不能正常显示. 解决:换一张图片,或重新生成JPEG图片. 如果还是不能正常显示,建议在设置完VISIBLE后,调用如下方法: iv.setVisibility(

Android ImageView 不显示JPEG图片 及 Android Studio中怎样引用图片资源

Android ImageView 不显示JPEG图片 今天在写一个小实例,ImageView在xml里面设置的是INVISIBLE,在代码里须要设置成setVisibility(View.VISIBLE),但图片没有显示出来,换成PNG或其他的JPEG格式的图片确能够正常的显示. 原因:显示的图片大小为5.39K,图片格式有损坏,所以不能正常显示. 解决:换一张图片.或又一次生成JPEG图片. 假设还是不能正常显示,建议在设置完VISIBLE后,调用例如以下方法: iv.setVisibili

如何将JPEG图片上的文字转换成word

JPEG 是目前最为主流的图片格式,如果要将该类型的扫描图之类文件中的文字内容复制输出,可采用以下这个通用性较强的方法.先打开Windows 系统自带的“画图”工具,选择打开指定JPEG 图片文件,此后单击菜单栏“文件-另存为”,在弹出对话框的“保存类型”中选择 TIFF 格式,再命名存储即可.此后,打开 Microsoft Office 程序组中的Microsoft Office Document imaging 组件,选择在此打开适才转换的那个Tiff 格式图片.再在Microsoft Of

Universal App图片文件和图片byte[]信息转换为bitmap

1. 打开图片文件并转换为BitmapImage类 首先要做的自然是打开一个图片文件了,可以使用FileOpenPicker来手动选择图片,总之能拿到一个StorageFile都行. //打开图片选择器,选择要发送的图片 var openPicker = new FileOpenPicker { ViewMode = PickerViewMode.Thumbnail, SuggestedStartLocation = PickerLocationId.PicturesLibrary }; ope

写入GPS信息到jpeg格式的图片中 ExifInterface类的使用

写入GPS信息到jpeg格式的图片中 ExifInterface类的使用 Jpge格式是图片压缩格式的一种,jpg就属于这其中一种:我们如需要将gps信息写入到图片中本身是比较简单的,获取图片句柄ExifInterface就可以了:但是我在做的过程中碰到了几个问题,解决之后便考虑将这一块写出来供大家参考. 写入GPS信息到jpeg格式的图片一共三个步骤,获取句柄,写入信息,验证写入信息 第一步:获取句柄 // 获取图片前缀 ExifInterfaceexif = newExifInterface

JPEG图片扩展信息读取与修改

近日项目中需要用到往jpg图片中写入信息(非水印),经调研发现Android中已经封装了读写jpg图片扩展信息的api(ExifInterface). 对应api地址:http://developer.android.com/reference/android/media/ExifInterface.html 读写均是键值对的方式,需要注意的是值的类型需要严格按照api定义格式. 支持读写节点为: 1.TAG_APERTURE:光圈 2.TAG_DATETIME:日期时间 类型:String,格

PHP error_log()将错误信息写入日志文件

error_log() 是发送错误信息到某个地方的一个函数,在程序编程中比较常见,尤其是在程序调试阶段. bool error_log ( string $message [, int $message_type = 0 [, string $destination [, string $extra_headers ]]] ) 把错误信息发送到 web 服务器的错误日志,或者到一个文件里. message 应该被记录的错误信息.信息长度限制:The default seem to be 1024

Lucene4.6 把时间信息写入倒排索引的Offset偏移量中,并实现按时间位置查询

有个新的技术需求,需要对Lucene4.x的源码进行扩展,把如下的有时间位置的文本写入倒排索引,为此,我扩展了一个TimeTokenizer分词器,在这个分词器里将时间信息写入 偏移量Offset中.扩展了一个Filter,最后查询时通过filter把时间信息传进去过滤想要的时间范围之内的结果. Lucene倒排索引中分好的词有两个偏移量一个是按字符的偏移量(BeginOffset和EndOffset)另一个是以分词(Term)为一个单元的position,每增加一个词position加1,如果