我从Internet上下载了一个图像并转换为String(这是不可更改的)
Dim Request As System.Net.WebRequest = _ System.Net.WebRequest.Create( _ "http://www.google.com/images/nav_logo.png") Dim WebResponse As System.Net.HttpWebResponse = _ DirectCast(Request.GetResponse(), System.Net.HttpWebResponse) Dim Stream As New System.IO.StreamReader( _ WebResponse.GetResponseStream, System.Text.Encoding.UTF8) Dim Text as String = Stream.ReadToEnd
如何将String转换回Stream?
所以我可以使用该流来获取图像.
像这样:
Dim Image As New Drawing.Bitmap(WebResponse.GetResponseStream)
但是现在我只有Text String,所以我需要这样的东西:
Dim Stream as Stream = ReadToStream(Text, System.Text.Encoding.UTF8) Dim Image As New Drawing.Bitmap(Stream)
编辑:
这个引擎主要用于下载网页,但我也试图用它来下载图像.字符串的格式为UTF8,如示例代码中所示...
我试过使用了MemoryStream(Encoding.UTF8.GetBytes(Text))
,但是在将流加载到图像时遇到了这个错误:
GDI +中发生了一般错误.
什么在转换中迷失了?
为什么要将二进制(图像)数据转换为字符串?没有意义......除非你使用base-64?
无论如何,为了扭转你所做的,你可以尝试使用new MemoryStream(Encoding.UTF8.GetBytes(text))
?
这将创建一个用字符串填充的新MemoryStream(通过UTF8).就个人而言,我怀疑它会起作用 - 你会遇到很多编码问题,将原始二进制文件视为UTF8数据...我希望读取或写入(或两者)抛出异常.
(编辑)
我应该补充说使用base-64,只需将数据作为a byte[]
,然后调用Convert.ToBase64String(...)
; 并获取数组,只需使用Convert.FromBase64String(...)
.
重新编辑,这正是我试图警告的内容......在.NET中,字符串不仅仅是a byte[]
,所以你不能简单地用二进制图像数据填充它.许多数据根本不会对编码有意义,因此可能会被悄悄地丢弃(或抛出异常).
要将原始二进制文件(如图像)作为字符串处理,您需要使用base-64编码; 然而,这会增加尺寸.请注意,这WebClient
可能会使这更简单,因为它byte[]
直接公开功能:
using(WebClient wc = new WebClient()) { byte[] raw = wc.DownloadData("http://www.google.com/images/nav_logo.png") //... }
无论如何,使用标准Stream
方法,这里是如何编码和解码base-64:
// ENCODE // where "s" is our original stream string base64; // first I need the data as a byte[]; I'll use // MemoryStream, as a convenience; if you already // have the byte[] you can skip this using (MemoryStream ms = new MemoryStream()) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = s.Read(buffer, 0, buffer.Length)) > 0) { ms.Write(buffer, 0, bytesRead); } base64 = Convert.ToBase64String(ms.GetBuffer(), 0, (int) ms.Length); } // DECODE byte[] raw = Convert.FromBase64String(base64); using (MemoryStream decoded = new MemoryStream(raw)) { // "decoded" now primed with the binary }