我需要将图像的字节信息写入文本文件。在大多数情况下,我已经做到了,但是似乎通过对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关闭之前设置一个断点并检查字符串,则其中没有所有多余的字符。
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字符。 资料不正确 NPP翻译的不正确数据的位置。 预期输出,突出显示具有错误数据的位置。 并排比较
答案 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