我在将GPS坐标转换为可以存储为EXIF信息的字节数组时遇到问题。
This questions表示EXIF坐标应表示为三个有理数:degrees/1, minutes/1, seconds/1
。我将十进制坐标转换为没有问题。例如,42.1234567
很容易转换为42/1, 7/1, 24/1
。
我的问题是,当我将它写入图像EXIF信息时,我不明白如何将其表示为字节数组。我正在使用的库名为ExifWorks,我在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中工作。
答案 0 :(得分: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
答案 1 :(得分: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)