#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
/// <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