理解EXIF的经纬度

时间:2017-08-26 18:37:35

标签: exif

如果我右键单击图像上的详细信息,我会在GPS下获得以下内容

enter image description here

查询EXIF(GpsLatitude和GpsLongitude)数据时我得到了

enter image description here

enter image description here

我可以看到第0行和第8行是度数和分钟,但其余的没有意义。我错过了什么?

谢谢

2 个答案:

答案 0 :(得分:1)

Exif将纬度和经度存储为三个有理数(分数),其中分子和分母长度为四个字节。

在您的示例中,您只显示前14个值。需要考虑24个字节的值。

具体而言,纬度小时值为0x00000027 / 0x0000000139 / 1

请注意,这些值以little endian存储,因此必须反转字节。

只取字节0/8/16,你可能会遗漏溢出到其他字节的值,并且你也假设分母总是一个。

使用库从图像中提取此信息可能要容易得多。我维护这样一个.NET库,它可以很好地与VB.NET一起使用,并且完全支持Exif和许多其他类型的元数据来自多种文件格式。

如果您有兴趣,请查看https://github.com/drewnoakes/metadata-extractor-dotnet

答案 1 :(得分:0)

无法获得最后一组显示小数位(ToDouble不起作用),但这非常接近

 If Not vLong Is Nothing Then
                    vLong1 = BitConverter.ToUInt32(vLong, 0)
                    vLong2 = BitConverter.ToUInt32(vLong, 8)
                    vLong3 = BitConverter.ToUInt32(vLong, 16)
                    vLongDecode = CType(vLong1, String) & " " & CType(vLong2, String) & " " & CType(vLong3, String)
                End If
                If Not vLat Is Nothing Then
                    vLat2 = BitConverter.ToUInt32(vLat, 8)
                    vLat1 = BitConverter.ToUInt32(vLat, 0)
                    vLat3 = BitConverter.ToUInt32(vLat, 16)
                    vLatDecode = CType(vLat1, String) & " " & CType(vLat2, String) & " " & CType(vLat3, String)
                End If