0

我在将 GPS 坐标转换为可以存储为 EXIF 信息的字节数组时遇到问题。

这个问题指出 EXIF 坐标应表示为三个有理数:degrees/1, minutes/1, seconds/1. 我没有问题将十进制坐标转换为那个。例如42.1234567很容易转换为42/1, 7/1, 24/1.

我的问题是,当我将其写入图像 EXIF 信息时,我不明白如何将其表示为字节数组。我正在使用的库称为ExifWorks,我在 VB.NET 中使用它。

ExifWorkssetProperty方法需要三件事:EXIF 字段 ID、作为数据的字节数组和数据类型。这是我如何使用它:

ew.SetProperty(TagNames.GpsLatitude, byteArrayHere, ExifWorks.ExifDataTypes.UnsignedRational)

我也试过:

ew.SetPropertyString(TagNames.GpsLatitude, "42/1, 7/1, 24/1")

这也行不通。

所以,我的问题是,如何将度-分-秒坐标转换为字节数组?到目前为止,我尝试过的所有内容都以无效的 EXIF 信息告终,并且不起作用。一个通用的解决方案很好......不一定必须在 VB.net 中工作。

4

2 回答 2

0

我已经想通了。这是解决方案:

Private Shared Function intToByteArray(ByVal int As Int32) As Byte()
    ' a necessary wrapper because of the cast to Int32
    Return BitConverter.GetBytes(int)
End Function

Private Shared Function doubleCoordinateToRationalByteArray(ByVal doubleVal As Double) As Byte()
    Dim temp As Double

    temp = Math.Abs(doubleVal)
    Dim degrees = Math.Truncate(temp)

    temp = (temp - degrees) * 60
    Dim minutes = Math.Truncate(temp)

    temp = (temp - minutes) * 60
    Dim seconds = Math.Truncate(temp)

    Dim result(24) As Byte
    Array.Copy(intToByteArray(degrees), 0, result, 0, 4)
    Array.Copy(intToByteArray(1), 0, result, 4, 4)
    Array.Copy(intToByteArray(minutes), 0, result, 8, 4)
    Array.Copy(intToByteArray(1), 0, result, 12, 4)
    Array.Copy(intToByteArray(seconds), 0, result, 16, 4)
    Array.Copy(intToByteArray(1), 0, result, 20, 4)

    Return result
End Function
于 2012-07-19T23:34:08.733 回答
0

你会得到更好的精度(到 0.001 弧秒,这是一英寸)

     Dim milliseconds = Math.Truncate(temp* 1000.0)

     ...

     Array.Copy(intToByteArray(milliseconds), 0, result, 16, 4)
     Array.Copy(intToByteArray(1000), 0, result, 20, 4)
于 2013-10-03T05:00:10.840 回答