2008-12-08 72 views
23

我從互聯網上下載的圖像,並轉換成字符串(這是不可更改)將字符串轉換爲Stream

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 

我如何轉換字符串回到流?

所以我可以使用該流來獲取圖像。

像這樣:

Dim Image As New Drawing.Bitmap(WebResponse.GetResponseStream) 

但現在我只文本字符串,所以我需要的東西是這樣的:

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

我會修改您的修改 – 2008-12-09 05:00:22

回答

38

爲什麼要將二進制(圖像)數據轉換爲字符串?這沒有意義......除非你使用base-64?

無論如何,要扭轉你所做的,你可以嘗試使用new MemoryStream(Encoding.UTF8.GetBytes(text))

這將創建一個新的MemoryStream與字符串(通過UTF8)啓動。就我個人而言,我懷疑它會起作用 - 你會遇到很多編碼問題,將原始二進制文件視爲UTF8數據......我期望讀取或寫入(或兩者)拋出異常。

(編輯)

我要補充一點與基地-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方法,這裏是如何編碼和解碼基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 
     } 
2

這會不會工作?我不知道你的字符串是什麼格式,所以一些按摩可能是必要的。

Dim strAsBytes() as Byte = new System.Text.UTF8Encoding().GetBytes(Text) 
Dim ms as New System.IO.MemoryStream(strAsBytes) 
1

以您所顯示的方式將二進制數據轉換爲字符串將使其無效。你不能把它拉出來。文本編碼軟件它。

您需要使用Base64 - 如@Marc所示。

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... 
}