Vb.net 将Lat/Long GPS坐标转换为EXIF Rational字节数组

Vb.net 将Lat/Long GPS坐标转换为EXIF Rational字节数组,vb.net,gps,jpeg,exif,exifworks,Vb.net,Gps,Jpeg,Exif,Exifworks,我在将GPS坐标转换为可存储为EXIF信息的字节数组时遇到问题 声明EXIF坐标应表示为三个有理数:度/1、分/1、秒/1。我很容易把十进制坐标转换成那样。例如,42.1234567很容易转换为42/1、7/1、24/1 我的问题是,当我将其写入图像EXIF信息时,我不理解如何将其表示为字节数组。我正在使用的库被称为,我正在VB.NET中使用它 ExifWorkssetProperty方法接受三件事:EXIF字段ID、作为数据的字节数组和数据类型。以下是我如何使用它: ew.SetPropert

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

声明EXIF坐标应表示为三个有理数:
度/1、分/1、秒/1
。我很容易把十进制坐标转换成那样。例如,
42.1234567
很容易转换为
42/1、7/1、24/1

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

ExifWorks
setProperty
方法接受三件事:EXIF字段ID、作为数据的字节数组和数据类型。以下是我如何使用它:

ew.SetProperty(TagNames.GpsLatitude, byteArrayHere, ExifWorks.ExifDataTypes.UnsignedRational)
我也试过:

ew.SetPropertyString(TagNames.GpsLatitude, "42/1, 7/1, 24/1")
这也不起作用


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

我已经解决了。以下是解决方案:

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

您将获得更好的精度(0.001弧秒,即一英寸)


您可能应该获得Exif规范(在线提供),并查看GPS标记的定义。然后获得一个十六进制编辑器,看看您实际上在向文件写入什么。另一个有用的工具是exiftool。有趣的是,exiftool显示了您先前链接的JPEG文件的正确GPS数据。
     Dim milliseconds = Math.Truncate(temp* 1000.0)

     ...

     Array.Copy(intToByteArray(milliseconds), 0, result, 16, 4)
     Array.Copy(intToByteArray(1000), 0, result, 20, 4)