需要将一些简单的元数据写入至少 .png 和 .jpg 并且不必将另一个 3rd 方库拖到我的程序中。几个小时后似乎没有任何效果,即使所有文件类型都不同等等。
考虑只存储在图像旁边的文件中,或者保留一个小的文件“数据库”和我需要的数据。
对我来说,我只是在重新加载图像时再次需要数据。数据包含一个转换因子,它告诉我有多少像素 = 1mm。
剧透...如果您不喜欢黑客,请立即离开。
基本上在我用二进制“@Conv=”写的文件末尾,后跟该值的 8 字节双精度值。
我的程序在二进制读取中打开图像...寻找到最后减去我的“hack”中的总字节数并寻找“@Conv=”。如果找到它,它会读取值。一旦确定了比例因子,程序就可以选择保存,而不必每次打开时都测量并输入一个值。
我有读取/查询、更新和添加数据的代码。
适用于 .png、.jpg 和可能的其他类型。
我这样做的文件被复制并且是本地的。显然,如果文件是从其他应用程序重写的,数据将会丢失,但对于许多应用程序的任何元数据来说,这可能都是正确的。
我最终存储了一些数据项,包括“原点”位置(以像素为单位)和图像的首选旋转 (0,90,180,270)。
一些 vbcode 只是为了好玩。
Shared arr_magic As Byte() = {CByte(AscW("@"c)), CByte(AscW("C"c)), CByte(AscW("o"c)), CByte(AscW("n"c)), CByte(AscW("v"c)), CByte(AscW("2"c)), CByte(AscW("="c))}
Const metaSize As Integer = 8 + 4 + 4 + 4
Function FileCheckScale(fn As String, ByRef origin As Point, ByRef angle As Integer, update As Boolean) As Double
Dim fr = New IO.StreamReader(fn)
Dim br As New IO.BinaryReader(fr.BaseStream)
fr.BaseStream.Seek(-(metaSize + arr_magic.Length), IO.SeekOrigin.End)
For i = 0 To arr_magic.Length - 1
If br.ReadByte() <> arr_magic(i) Then
fr.Close()
Return 0.0 ' <= 0 means not found
End If
Next
Dim v As Double = br.ReadDouble
If update Then
origin.X = br.ReadInt32
origin.Y = br.ReadInt32
angle = br.ReadInt32
End If
fr.Close()
Return v
End Function
Sub FileUpdateScale(fn As String, v As Double, origin As Point, angle As Integer)
Dim fr = New IO.FileStream(fn, IO.FileMode.Open, IO.FileAccess.Write)
Dim br As New IO.BinaryWriter(fr)
fr.Seek(-(metaSize + arr_magic.Length), IO.SeekOrigin.End)
br.Write(arr_magic)
br.Write(v)
br.Write(origin.X)
br.Write(origin.Y)
br.Write(angle)
fr.Close()
End Sub
Sub FileAddScale(fn As String, v As Double, origin As Point, angle As Integer)
Dim fr = New IO.StreamWriter(fn, True)
Dim br As New IO.BinaryWriter(fr.BaseStream)
fr.BaseStream.Seek(0, IO.SeekOrigin.End)
br.Write(arr_magic)
br.Write(v)
br.Write(origin.X)
br.Write(origin.Y)
br.Write(angle)
fr.Close()
End Sub