我正在开发一个系统,该系统允许使用ASP.NET C#将图像上传到服务器。我正在处理图像,并且一切正常。我设法找到一种读取创建日期的EXIF数据并将其解析为DateTime的方法。那也很好。

我现在正尝试从EXIF读取GPS数据。我想记录纬度和经度数据。

我将此列表用作对EXIF数据的引用(使用属性项目的数字)http://www.exiv2.org/tags.html

这是捕获创建日期的方法(有效)。

public DateTime GetDateTaken(Image targetImg)
{
    DateTime dtaken;

    try
    {
        //Property Item 306 corresponds to the Date Taken
        PropertyItem propItem = targetImg.GetPropertyItem(0x0132);

        //Convert date taken metadata to a DateTime object
        string sdate = Encoding.UTF8.GetString(propItem.Value).Trim();
        string secondhalf = sdate.Substring(sdate.IndexOf(" "), (sdate.Length - sdate.IndexOf(" ")));
        string firsthalf = sdate.Substring(0, 10);
        firsthalf = firsthalf.Replace(":", "-");
        sdate = firsthalf + secondhalf;
        dtaken = DateTime.Parse(sdate);
    }
    catch
    {
        dtaken = DateTime.Parse("1956-01-01 00:00:00.000");
    }
    return dtaken;
}

以下是我对GPS做同样的尝试。
public float GetLatitude(Image targetImg)
{
    float dtaken;

    try
    {
        //Property Item 0x0002 corresponds to the Date Taken
        PropertyItem propItem = targetImg.GetPropertyItem(2);

        //Convert date taken metadata to a DateTime object
        string sdate = Encoding.UTF8.GetString(propItem.Value).Trim();
        dtaken = float.Parse(sdate);
    }
    catch
    {
        dtaken = 0;
    }
    return dtaken;
}

传入和传出的值是“5\0\0\0\0\0\0l\t\0\0d\0\0\0\0\0\0\0\0\0\0”

那是来自iPhone 4拍摄的图像,该图像确实带有GPS EXIF数据。

我知道那里有可以做到这一点的类,但是我更愿意写自己的类-尽管我很乐意提出建议:-)

提前致谢。

最佳答案

根据tomfanning的link posted above,属性项0x0002是表示为PropertyTagTypeRational的纬度。有理类型为defined as ...



当它实际上只是一系列字节时,您正在尝试将其解析为字符串。根据以上所述,应该在该字节数组中包装3对32位无符号整数,您可以使用以下方法进行检索:

uint degreesNumerator   = BitConverter.ToUInt32(propItem.Value, 0);
uint degreesDenominator = BitConverter.ToUInt32(propItem.Value, 4);
uint minutesNumerator   = BitConverter.ToUInt32(propItem.Value, 8);
uint minutesDenominator = BitConverter.ToUInt32(propItem.Value, 12);
uint secondsNumerator   = BitConverter.ToUInt32(propItem.Value, 16);
uint secondsDenominator = BitConverter.ToUInt32(propItem.Value, 20);

得到这些值后,您要进行的工作是让您确定:)这些是文档说的:

08-18 02:54
查看更多