vb.net - 将图像的字节写入文本文件
问题描述
我需要将图像的字节信息写入文本文件。在大多数情况下,我已经做到了,但似乎通过以 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 翻译的不正确数据 的位置。 突出显示不正确数据的位置的预期输出。 并排比较
解决方案
问题是,您正在获取图像数据,假装它是文本,使用特定编码将其解码为文本,然后使用 将其写入输出流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
推荐阅读
- spring - 如果我有@Transactional 和 JOIN FETCH,如何摆脱“无法编写 JSON:未能延迟初始化角色集合”?
- python - 我不能为我的生活修复我的无限循环
- amazon-web-services - 尝试运行 aws iam list-users 命令时出错
- scala - 我可以像对象一样在包之间引入隐式优先关系吗?
- regex - 正则表达式提取 2 个连接词列表
- python - np.index_exp[] 如何在具有 rgb 颜色示例的 3D 体素/体积图中工作
- laravel - Laravel 未在刀片页面上显示最新更改
- c# - 具有继承的 Blazor 模板组件
- python - 在python中将重复列附加到一列中
- next.js - OpenLiteSpeed 服务器(DigitalOcean)中的 NextJS 应用程序崩溃