4字节 经纬度_获取照片中Exif信息里GPS经纬度数

该代码段展示了如何从图片的Exif信息中读取GPS坐标,包括经纬度的计算,涉及到BitConverter转换和方向判断。
摘要由CSDN通过智能技术生成

获取照片中Exif信息里GPS经纬度数

#region 读取图片中GPS点

/// /// 获取图片中的GPS坐标点

///

/// 图片路径

///

返回坐标【纬度+经度】用"+"分割 取数组中第0和1个位置的值

public String fnGPS坐标(String p_图片路径)

{

String s_GPS坐标 = "";

//载入图片

Image objImage = Image.FromFile(p_图片路径);

//取得所有的属性(以PropertyId做排序)

var propertyItems = objImage.PropertyItems.OrderBy(x => x.Id);

//暂定纬度N(北纬)

char chrGPSLatitudeRef = 'N';

//暂定经度为E(东经)

char chrGPSLongitudeRef = 'E';

foreach (PropertyItem objItem in propertyItems)

{

//只取Id范围为0x0000到0x001e

if (objItem.Id >= 0x0000 && objItem.Id <= 0x001e)

{

objItem.Id = 0x0002;

switch (objItem.Id)

{

case 0x0000:

var query = from tmpb in objItem.Value select tmpb.ToString();

string sreVersion = string.Join(".", query.ToArray());

break;

case 0x0001:

chrGPSLatitudeRef = BitConverter.ToChar(objItem.Value, 0);

break;

case 0x0002:

if (objItem.Value.Length == 24)

{

//degrees(将byte[0]~byte[3]转成uint, 除以byte[4]~byte[7]转成的uint)

double d = BitConverter.ToUInt32(objItem.Value, 0) * 1.0d / BitConverter.ToUInt32(objItem.Value, 4);

//minutes(將byte[8]~byte[11]转成uint, 除以byte[12]~byte[15]转成的uint)

double m = BitConverter.ToUInt32(objItem.Value, 8) * 1.0d / BitConverter.ToUInt32(objItem.Value, 12);

//seconds(將byte[16]~byte[19]转成uint, 除以byte[20]~byte[23]转成的uint)

double s = BitConverter.ToUInt32(objItem.Value, 16) * 1.0d / BitConverter.ToUInt32(objItem.Value, 20);

//计算经纬度数值, 如果是南纬, 要乘上(-1)

double dblGPSLatitude = (((s / 60 + m) / 60) + d) * (chrGPSLatitudeRef.Equals('N') ? 1 : -1);

string strLatitude = string.Format("{0:#} deg {1:#}' {2:#.00}\" {3}", d

, m, s, chrGPSLatitudeRef);

//纬度+经度

s_GPS坐标 += dblGPSLatitude + "+";

}

break;

case 0x0003:

//透过BitConverter, 将Value转成Char('E' / 'W')

//此值在后续的Longitude计算上会用到

chrGPSLongitudeRef = BitConverter.ToChar(objItem.Value, 0);

break;

case 0x0004:

if (objItem.Value.Length == 24)

{

//degrees(将byte[0]~byte[3]转成uint, 除以byte[4]~byte[7]转成的uint)

double d = BitConverter.ToUInt32(objItem.Value, 0) * 1.0d / BitConverter.ToUInt32(objItem.Value, 4);

//minutes(将byte[8]~byte[11]转成uint, 除以byte[12]~byte[15]转成的uint)

double m = BitConverter.ToUInt32(objItem.Value, 8) * 1.0d / BitConverter.ToUInt32(objItem.Value, 12);

//seconds(将byte[16]~byte[19]转成uint, 除以byte[20]~byte[23]转成的uint)

double s = BitConverter.ToUInt32(objItem.Value, 16) * 1.0d / BitConverter.ToUInt32(objItem.Value, 20);

//计算精度的数值, 如果是西经, 要乘上(-1)

double dblGPSLongitude = (((s / 60 + m) / 60) + d) * (chrGPSLongitudeRef.Equals('E') ? 1 : -1);

}

break;

case 0x0005:

string strAltitude = BitConverter.ToBoolean(objItem.Value, 0) ? "0" : "1";

break;

case 0x0006:

if (objItem.Value.Length == 8)

{

//将byte[0]~byte[3]转成uint, 除以byte[4]~byte[7]转成的uint

double dblAltitude = BitConverter.ToUInt32(objItem.Value, 0) * 1.0d / BitConverter.ToUInt32(objItem.Value, 4);

}

break;

}

}

}

return s_GPS坐标;

}

#endregion

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值