我从互联网上下载图像并转换为字符串(这是不可更改的)
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 +中发生了一般性错误。
转化中会丢失什么?
答案 0 :(得分:39)
为什么要将二进制(图像)数据转换为字符串?这没有意义......除非你使用base-64?
无论如何,为了扭转你所做的事情,你可以尝试使用new MemoryStream(Encoding.UTF8.GetBytes(text))
?
这将创建一个用字符串填充的新MemoryStream(通过UTF8)。就个人而言,我怀疑它会起作用 - 你会遇到很多编码问题,将原始二进制文件视为UTF8数据...我希望读取或写入(或两者)抛出异常。
(编辑)
我应该添加它以使用base-64,只需将数据作为byte[]
,然后调用Convert.ToBase64String(...)
;要获取数组,只需使用Convert.FromBase64String(...)
。
重新编辑,这正是我试图警告的内容......在.NET中,字符串不仅仅是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
}
答案 1 :(得分:2)
这会有用吗?我不知道你的字符串是什么格式,所以可能需要一些按摩。
Dim strAsBytes() as Byte = new System.Text.UTF8Encoding().GetBytes(Text)
Dim ms as New System.IO.MemoryStream(strAsBytes)
答案 2 :(得分:1)
以您显示的方式将二进制数据转换为字符串将使其无效。你不能把它打包出去。文本编码会使用它。
你需要使用Base64 - 就像@Marc节目一样。
答案 3 :(得分:1)
var bytes = new byte[contents.Length * sizeof( char )];
Buffer.BlockCopy( contents.ToCharArray(), 0, bytes, 0, bytes.Length );
using( var stream = new MemoryStream( bytes ) )
{
// do your stuff with the stream...
}