将图像的字节写入文本文件

时间:2018-10-17 10:47:09

标签: vb.net text

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

左边是文本文件,右边是图像: enter image description here 我做了一些非常复杂的事情,以及一些非常简单的事情。

从此:

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关闭之前设置一个断点并检查字符串,则其中没有所有多余的字符。

  

ChrW(137)&“ PNG”&vbCrLf&ChrW(26)&vbLf&vbNullChar&vbNullChar   &vbNullChar&vbCr&“ IHDR”&vbNullChar&vbNullChar&ChrW(2)&“Í”   &vbNullChar&vbNullChar&vbNullChar&“Ë”&ChrW(4)&ChrW(3)&   vbNullChar&vbNullChar&vbNullChar&“g§³”&ChrW(134)&vbNullChar   &vbNullChar&vbNullChar&ChrW(1)&“ sRGB”&vbNullChar&“®Î”&   ChrW(28)和“é”&vbNullChar&vbNullChar&vbNullChar&ChrW(4)&   “ gAMA”&vbNullChar&vbNullChar&“±”&ChrW(143)&vbVerticalTab&   “üa”&ChrW(5)&vbNullChar&vbNullChar&vbNullChar&“ 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&   “ 1/2升!” &vbFormFeed&“î^ËÜ»'”&ChrW(138)&“Bï”&ChrW(26)&“dòí”&   ChrW(26)&ChrW(20)&“Á¥”&vbFormFeed&“½”&ChrW(148)&ChrW(153)   &“oÙ”&ChrW(132)&“!¬Í”&vbNullChar&“®%”&ChrW(16)&“ö”&...   ... ...

更进一步,似乎某些字符导致了这种情况。特别是非ASCII字符。 资料不正确 enter image description here NPP翻译的不正确数据的位置。 enter image description here 预期输出,突出显示具有错误数据的位置。 enter image description here 并排比较 enter image description here

1 个答案:

答案 0 :(得分:2)

问题是,您要获取图像数据,假装它像文本一样,使用特定的编码将其解码为文本,然后使用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