首页 > 解决方案 > 将图像的字节写入文本文件

问题描述

我需要将图像的字节信息写入文本文件。在大多数情况下,我已经做到了,但似乎通过以 UTF8 编码字节,在图像数据中编码了额外的信息,这是不属于的东西。最值得注意的是,0xEF 和 0xBF 是连续的。我只能假设这是因为我使用 UTF8 进行编码。那么问题就变成了,如何在没有编码器干扰数据的情况下将图像字节写入文本文件?

左边是文本文件,右边是图像: 在此处输入图像描述 我做了一些非常复杂的事情,也非常简单的事情。

由此:

Dim str As String = String.Empty
For Each c In byteArray
    str &= ChrW(c)
Next

对此:

Dim labelFileStream As FileStream = New FileStream(labelPath, FileMode.Append, FileAccess.Write)
Dim labelStreamWriter As StreamWriter = New StreamWriter(labelFileStream)
Dim f_convOutBytes() As Byte = File.ReadAllBytes(f_imagePath)
Dim totalStreamLength As Int32 = f_convOutBytes.Length
Dim labelOutStream(totalStreamLength - 1) As Byte
f_convOutBytes.CopyTo(labelOutStream, 0)
labelStreamWriter.Write(Encoding.UTF8.GetString(labelOutStream))
labelStreamWriter.Close()
labelFileStream.Close()

如果我在 streamwriter 关闭之前设置断点并检查字符串,则其中没有所有额外的字符。

"0PLTE" & vbBack & vbBack & vbBack & ChrW(24) & ChrW(24) & ChrW(24) & "&&&888HHHXXXhhhxxx" & ChrW(136) & ChrW(136) & ChrW(136) & ChrW(152) & ChrW (152) & ChrW(152) & "¨¨¨¸¸¸ÒÒÒØØØèèèøøø!ä0" & ChrW(144) & vbNullChar & vbNullChar & vbNullChar & vbTab & "pHYs" & vbNullChar & vbNullChar & ChrW(14) & "Ã" & vbNullChar & vbNullChar & ChrW(14) & "Ã" & ChrW(1) & "Ço¨d" & vbNullChar & vbNullChar & ")ÄIDATxÚí" & ChrW(157) & "I@SI·Ç" & ChrW(19 ) & "ðí" & vbTab & "Á½LöV" & vbBack & vbTab & "½l!" & vbFormFeed & "î^ËÜ»'" &

更进一步,似乎某些角色会导致这种情况。特别是非 ASCII 字符。不正确的数据 NPP 翻译的不正确数据 在此处输入图像描述 的位置。 在此处输入图像描述 突出显示不正确数据的位置的预期输出。 在此处输入图像描述 并排比较 在此处输入图像描述

标签: vb.nettext

解决方案


问题是,您正在获取图像数据,假装它是文本,使用特定编码将其解码为文本,然后使用 将其写入输出流StreamWriter,这会将“文本”再次编码回字节,很可能使用不同的编码。即使您使用相同的编码来读取和写入它,也会有问题,因为并非所有字节数组都是有效文本,因此您可能会在转换中丢失一些数据(就像将句子从英语翻译成西班牙语然后从西班牙语再次变成英语)。但是,当您甚至不使用两种方式的相同编码时,您肯定不会得到相同的结果。由于它不是文本,因此根本没有理由将其转换为文本。只需将其保留为一系列原始字节,不要更改它们的值。

要将字节从原始图像文件复制到输出流,而不对数据进行任何修改,您可以这样做:

Using outputStream As New FileStream(outputPath, FileMode.Append, FileAccess.Write)
    Dim imageBytes() As Byte = File.ReadAllBytes(imagePath)
    outputStream.Write(imageBytes, 0, imageBytes.Length)
End Using

或者,更好的是,如果您可以将源图像文件作为流打开,您可以这样做:

Using outputStream As New FileStream(outputPath, FileMode.Append, FileAccess.Write)
    Using inputStream As New FileStream(imagePath, FileMode.Open, FileAccess.Read)
        inputStream.CopyTo(outputStream)
    End Using
End Using

推荐阅读