0

GPS 座標を、EXIF 情報として保存できるバイト配列に変換する際に問題が発生しています。

この質問は、EXIF 座標を 3 つの有理数で表す必要があることを示していますdegrees/1, minutes/1, seconds/1。10進座標をそれに変換するのに問題はありません。たとえば、42.1234567は簡単に に変換され42/1, 7/1, 24/1ます。

私の問題は、画像の EXIF 情報に書き込むときに、これをバイト配列として表す方法がわからないことです。私が使用しているライブラリはExifWorksと呼ばれ、VB.NET で使用しています。

ExifWorkssetPropertyメソッドは、EXIF フィールド ID、データとしてのバイト配列、およびデータ型の 3 つを取ります。使用方法は次のとおりです。

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 に答える