从JPEG中提取EXIF

时间:2011-01-23 03:22:14

标签: c# asp.net .net exif exiflib

我正忙着从我的JPEG中读取EXIF数据。我觉得这很容易做到。

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

  1. 上传包含JPEG的ZIP文件(来自我的iPhone 4)
  2. 使用首选命名约定
  3. 重命名ZIP文件中的JPEG
  4. 将ZIP文件从ZIP文件中提取到图像文件夹
  5. 调整图像大小以用于各种用途(例如缩略图等)
  6. 将文件名和选定的类别ID保存到SQL Server,以便我可以将这两者用于显示目的
  7. 我想从原始JPEG图像中提取纬度和经度,然后在插入文件名和类别ID的同一个proc中将这些值插入到我的数据库中(步骤#5)。我需要这些值才能使用Google Maps API。最简单的方法是什么?

    更新

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

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

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

      

    指定的演员表无效。

    有什么建议吗?

2 个答案:

答案 0 :(得分:8)

要将所有答案放在一起,这是完整的解决方案。

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

答案 1 :(得分:1)

从图像中检索GPS元数据的另一个选择是使用MetadataExtractor库。它可用on 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