6

我正忙于从我的 JPEG 中读取 EXIF 数据。我认为这很容易做到。

到目前为止,我已经为家人的在线图片库完成了以下步骤(使用 C#/ASP.Net 3.5):

  1. 上传包含 JPEG 的 ZIP 文件(来自我的 iPhone 4)
  2. 使用首选命名约定重命名 ZIP 文件中的 JPEG
  3. 将 JPEG 从 ZIP 文件中提取到图像文件夹
  4. 调整图像大小以用于各种用途(例如缩略图等)
  5. 将文件名和选定的类别 ID 保存到 SQL Server,以便我可以将两者关联以进行显示

我想从原始 JPEG 图像中提取纬度和经度,然后将这些值插入到我的数据库中,并在插入文件名和类别 ID 的同一过程中(步骤 #5)。我需要这些值才能使用 Google Maps API。最简单的方法是什么?

更新:

ExifLib 看起来很棒,但是当我执行以下操作时:

double d; 
ExifReader er = new ExifReader(sFileName); 
er.GetTagValue<double>(ExifTags.GPSLatitude, out d); 

我在最后一行收到此错误:

指定的演员表无效。

有什么建议么?

4

2 回答 2

9

为了将所有答案汇总在一起,这里是完整的解决方案。

using (ExifReader reader = new ExifReader(e.Target))
{
    Double[] GpsLongArray;
    Double[] GpsLatArray;
    Double GpsLongDouble;
    Double GpsLatDouble;

    if (reader.GetTagValue<Double[]>(ExifTags.GPSLongitude, out GpsLongArray) 
        && reader.GetTagValue<Double[]>(ExifTags.GPSLatitude, out GpsLatArray))
    {
        GpsLongDouble = GpsLongArray[0] + GpsLongArray[1] / 60 + GpsLongArray[2] / 3600;
        GpsLatDouble  = GpsLatArray[0]  + GpsLatArray[1]  / 60 + GpsLatArray[2]  / 3600;

        Console.WriteLine("The picture was taken at {0},{1}", GpsLongDouble, GpsLatDouble);

    }

}

输出:

    The picture was taken at 76.8593333333333,39.077
于 2012-01-06T09:02:52.423 回答
2

从图像中检索 GPS 元数据的另一个选项是使用MetadataExtractor库。它在 NuGet上可用。它支持来自 JPEG 文件的 Exif GPS 数据,以及大量其他元数据类型和文件类型。

要访问 GPS 位置,请使用以下代码:

var directories = ImageMetadataReader.ReadMetadata(jpegFilePath);

var gps = directories.OfType<GpsDirectory>().FirstOrDefault();

if (gps != null)
{
    var location = gps.GetGeoLocation();

    if (location != null)
        Console.WriteLine("Lat {0} Lng {1}", location.Latitude, location.Longitude);
}

这是iPhone 6的示例输出。

于 2015-08-12T11:41:17.027 回答