Arj*_*rma 10 c# exif geolocation windows-phone exiflib
我想从图像中获取有关地理位置的信息 ,如下图所示

void cam_Completed(object sender, PhotoResult e)
{
if (e.TaskResult == TaskResult.OK)
{
Image cameraImage = new Image();
BitmapImage bImage = new BitmapImage();
bImage.SetSource(e.ChosenPhoto);
cameraImage.Source = bImage;
e.ChosenPhoto.Position = 0;
ExifReader reader = new ExifReader(e.ChosenPhoto);
double gpsLat, gpsLng;
reader.GetTagValue<double>(ExifTags.GPSLatitude,
out gpsLat))
reader.GetTagValue<double>(ExifTags.GPSLongitude,
out gpsLng))
MessageBox.Show(gpsLat.ToString() + "" + gpsLng.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
这样我们就可以检测拍摄图像的位置.请帮助找到这些属性.
这些答案似乎都没有完全正常和正确.以下是我使用这个EXIF库的想法,它也可以作为NuGet包使用.
public static double[] GetLatLongFromImage(string imagePath)
{
ExifReader reader = new ExifReader(imagePath);
// EXIF lat/long tags stored as [Degree, Minute, Second]
double[] latitudeComponents;
double[] longitudeComponents;
string latitudeRef; // "N" or "S" ("S" will be negative latitude)
string longitudeRef; // "E" or "W" ("W" will be a negative longitude)
if (reader.GetTagValue(ExifTags.GPSLatitude, out latitudeComponents)
&& reader.GetTagValue(ExifTags.GPSLongitude, out longitudeComponents)
&& reader.GetTagValue(ExifTags.GPSLatitudeRef, out latitudeRef)
&& reader.GetTagValue(ExifTags.GPSLongitudeRef, out longitudeRef))
{
var latitude = ConvertDegreeAngleToDouble(latitudeComponents[0], latitudeComponents[1], latitudeComponents[2], latitudeRef);
var longitude = ConvertDegreeAngleToDouble(longitudeComponents[0], longitudeComponents[1], longitudeComponents[2], longitudeRef);
return new[] { latitude, longitude };
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
助手:
public static double ConvertDegreeAngleToDouble(double degrees, double minutes, double seconds, string latLongRef)
{
double result = ConvertDegreeAngleToDouble(degrees, minutes, seconds);
if (latLongRef == "S" || latLongRef == "W")
{
result *= -1;
}
return result;
}
public static double ConvertDegreeAngleToDouble(double degrees, double minutes, double seconds)
{
return degrees + (minutes / 60) + (seconds / 3600);
}
Run Code Online (Sandbox Code Playgroud)
EXIF您将需要从图像中读取数据。
您可以使用这样的库
\n\n// Instantiate the reader\nExifReader reader = new ExifReader(@"..path to your image\\...jpg");\n\n// Extract the tag data using the ExifTags enumeration\ndouble gpsLat, gpsLng;\nif (reader.GetTagValue<double>(ExifTags.GPSLatitude, \n out gpsLat))\n{\n // Do whatever is required with the extracted information\n //...\n}\nif (reader.GetTagValue<double>(ExifTags.GPSLongitude, \n out gpsLng))\n{\n // Do whatever is required with the extracted information\n //...\n}\nRun Code Online (Sandbox Code Playgroud)\n\n更新。代码更改为使用MemoryStream
void cam_Completed(object sender, PhotoResult e)\n {\n if (e.TaskResult == TaskResult.OK)\n {\n using (MemoryStream memo = new MemoryStream())\n {\n e.ChosenPhoto.CopyTo(memo);\n memo.Position = 0;\n using (ExifReader reader = new ExifReader(memo))\n {\n double[] latitudeComponents;\n reader.GetTagValue(ExifTags.GPSLatitude, out latitudeComponents);\n\n double[] longitudeComponents;\n reader.GetTagValue(ExifTags.GPSLongitude, out longitudeComponents);\n\n // Lat/long are stored as D\xc2\xb0M\'S" arrays, so you will need to reconstruct their values as below:\n var latitude = latitudeComponents[0] + latitudeComponents[1] / 60 + latitudeComponents[2] / 3600;\n var longitude = longitudeComponents[0] + longitudeComponents[1] / 60 + longitudeComponents[2] / 3600;\n\n // latitude and longitude should now be set correctly...\n }\n }\n }\n }\nRun Code Online (Sandbox Code Playgroud)\n