如何在Windows Phone 8中获取捕获的图像或存储的图像的地理标记详细信息

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)

这样我们就可以检测拍摄图像的位置.请帮助找到这些属性.

Sam*_*Sam 6

这些答案似乎都没有完全正常和正确.以下是我使用这个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)

感谢伊戈尔的回答为辅助方法和geedubb的主法.


gee*_*ubb 5

EXIF您将需要从图像中读取数据。

\n\n

您可以使用这样的库

\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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新。代码更改为使用MemoryStream

\n\n
    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    }\n
Run Code Online (Sandbox Code Playgroud)\n