【发布时间】:2021-04-20 22:20:30
【问题描述】:
我正在尝试创建要存储在 PNG 图像文件中的元数据,具体取决于名为 sc_status 的参数的值。
代码如下:
Dim qualityParam As Object
Dim encoderParams As Object = New Imaging.EncoderParameters(1)
Dim ImgCodec As Imaging.ImageCodecInfo
ImgCodec = GetEncoderInfo("image/png")
qualityParam = New Imaging.EncoderParameter(Imaging.Encoder.ColorDepth, 32L)
encoderParams.Param(0) = qualityParam
'---
' img_src Image is created here
' file_name String is created here
'---
' Creating the PropertyItem
Dim propit As Imaging.PropertyItem = CType(System.Runtime.Serialization.FormatterServices.GetUninitializedObject(GetType(Imaging.PropertyItem)), Imaging.PropertyItem)
propit.Id = 270 '0x010E = Image description
propit.Type = 2
If sc_status = 3 Then
propit.Value = System.Text.Encoding.UTF8.GetBytes("HQ")
ElseIf sc_status = 5 Then
propit.Value = System.Text.Encoding.UTF8.GetBytes("LQ")
Else
propit.Value = System.Text.Encoding.UTF8.GetBytes("UQ")
End If
' Storing the PropertyItem
img_src.SetPropertyItem(propit)
' Saving png
img_src.Save(file_name, ImgCodec, encoderParams)
当我查看存储在 PNG 块中的内容时,我希望有[72, 81, 0] 或[76, 81, 0] 或[85, 81, 0] 的字节序列,对应于字符串"LQ","HQ",@987654328 @ 加上 vbNullChar,它会自动添加到 PNG 块的末尾。
但由于我忽略的原因,有时我的字节序列更长,例如[72, 81, 28, 8, 1, 0] 给出 - 使用 System.Text.Encoding.UTF8.GetString() 后 - 字符串:
HQ & ChrW(28) & vbBack & ChrW(1) & vbNullChar
有时[72, 81, 22, 8, 1, 0],有时[72, 81, 19, 8, 1, 0],有时[72, 81, 23, 8, 1, 0]。
我不明白为什么在img_src.Save() 过程中有时会在元数据中添加额外的字节。
我究竟做错了什么?非常欢迎任何帮助!
【问题讨论】:
标签: vb.net graphics png metadata