#region 读取图片中GPS点 /// <summary> /// 获取图片中的GPS坐标点 /// </summary> /// <param name="p_图片路径">图片路径</param> /// <returns>返回坐标【纬度+经度】用"+"分割 取数组中第0和1个位置的值</returns> 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