【发布时间】:2021-04-21 13:45:19
【问题描述】:
这个话题是Extra characters/bytes in metadata after saving a PNG image的延续
但我现在考虑JPEGfiles,而不是PNG files。
我正在尝试根据名为“sc_status”的参数的值写入元数据。我改编了 Jimi 的提议,该提议非常适用于 PNG 文件:
Imports System.Drawing.Imaging
Imports System.Text
'0x9286 = User Comments
Dim imageDescriptionPropItem = &H9286
' Property Type 2: null-terminated string
Dim PropertyTagTypeASCII As short = 2
Dim encoderParams As New EncoderParameters(1)
Dim ImgCodec = ImageCodecInfo.GetImageEncoders().
FirstOrDefault(Function(enc) enc.FormatID = ImageFormat.Jpeg.Guid)
If ImgCodec Is Nothing Then
Throw New FormatException("Invalid format")
End If
encoderParams.Param(0) = New EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 95L)
Dim imagePath = [Image Source Path]
Dim imageDestinationPath = [Image Destination Path]
Dim imageSourcePath = Image.FromStream(New MemoryStream(File.ReadAllBytes(imageSourcePath)))
Dim propItem As PropertyItem = DirectCast(FormatterServices.GetUninitializedObject(
GetType(PropertyItem)), PropertyItem)
propItem.Id = imageDescriptionPropItem
propItem.Type = PropertyTagTypeASCII
Dim description = String.Empty
Select Case sc_status
Case 3
description = "HQ" & ChrW(0)
Case 5
description = "LQ" & ChrW(0)
Case Else
description = "UQ" & ChrW(0)
End Select
' Length of the string including the terminator: mandatory
propItem.Value = Encoding.UTF8.GetBytes(description)
propItem.Len = propItem.Value.Length
imageSource.SetPropertyItem(propItem)
imageSource.Save(imageDestinationPath, ImgCodec, encoderParams)
元数据检查通过以下方式执行:
Dim imageEncoded = Image.FromStream(New MemoryStream(File.ReadAllBytes(imageDestinationPath)))
Dim propItemSaved = imageEncoded.GetPropertyItem(imageDescriptionPropItem)
Dim descr = Encoding.UTF8.GetString(propItemNew.Value).TrimEnd(ChrW(0))
我希望在字节序列中有[72, 81, 0] 或[76, 81, 0] 或[85, 81, 0]。但我得到[72, 0, 81, 0, 0] 或[76, 0, 81, 0, 0] 或[85, 0, 81, 0, 0]。所以每个字符之间多了一个0字节,提供如下字符串:"L" & vbNullChar & "Q" & vbNullChar等。
为什么要插入这些零以及如何摆脱它?
为什么它适用于PNG 图像(使用图像描述道具&H10E)而不是JPEG 图像(使用用户评论道具&H9286)?
非常感谢您的支持。
【问题讨论】:
标签: vb.net graphics metadata jpeg gdi+