2009-10-28 72 views
1

是代碼中的問題.. 我正嘗試讀取.gif文件並寫入另一個.gif,如果我這樣做......新創建的.gif文件不會顯示正確的圖像insted垃圾圖像來是代碼中的錯誤。使用StreamReader複製圖像時的損壞

private void ReadFile() 
    { 
     StreamReader MyReader = new StreamReader(@"C:\\Users\\admin\\Desktop\\apache_pb22_ani.gif"); 
     string ReadFile= MyReader.ReadToEnd(); 
     MyReader .Close(); 

     StreamWriter MYWriter = new StreamWriter(@"C:\\Hi.gif"); 
     MYWriter.Write(ReadFile); 
     MYWriter.Close(); 

     //throw new NotImplementedException(); 
    } 

如果我從服務器讀取圖像,如果我寫的圖像文件也出現同樣的問題,是什麼問題...從服務器和寫入讀取圖像 代碼是在這裏

StringBuilder sb = new StringBuilder(); 
     // used on each read operation 
     byte[] buf = new byte[8192]; 
     // prepare the web page we will be asking for 
     HttpWebRequest request = (HttpWebRequest) 
       WebRequest.Create("http://10.10.21.178/Untitled.jpg"); 
     // execute the request 
     HttpWebResponse response = (HttpWebResponse) 
       request.GetResponse(); 
     // we will read data via the response stream 
     Stream resStream = response.GetResponseStream(); 

     string tempString = null; 
     int count = 0; 

     StreamWriter FileWriter = new StreamWriter("C:\\Testing.jpg"); 


     do 
     { 
      // fill the buffer with data 
      count = resStream.Read(buf, 0, buf.Length); 
      // make sure we read some data 
      if (count != 0) 
      { 
       // translate from bytes to ASCII text. 
       // Not needed if you'll get binary content. 

       tempString = Encoding.ASCII.GetString(buf, 0, count); 
       FileWriter.Write(tempString); 
       // continue building the string 
       sb.Append(tempString); 
      } 
     } 
     while (count > 0); // any more data to read? 

     FileWriter.Close(); 

     // print out page source 
     // Console.WriteLine(sb.ToString()); 
     //throw new NotImplementedException(); 
    } 
+1

這有一個C++標籤,因爲......? – GManNickG 2009-10-28 05:03:53

+0

更多描述性標題請 – mpen 2009-10-28 05:10:14

+0

固定兩點 – 2009-10-28 05:21:26

回答

7

二進制數據(如圖像)在.NET字符串中不起作用;你想要的東西像(假設File.Copy是不是一種選擇):

using(Stream source = File.OpenRead(fromPath)) 
using(Stream dest = File.Create(toPath)) { 
    byte[] buffer = new byte[1024]; 
    int bytes; 
    while((bytes = source.Read(buffer, 0, buffer.Length)) > 0) { 
     dest.Write(buffer, 0, bytes); 
    } 
} 

這會將圖像作爲二進制(byte[]),並且採用了緩衝/循環,​​以避免吹起來,如果你有一個大的圖像(當File.ReadAllBytes可能會很昂貴)。

+1

謝謝..它的工作原理:-) – Naruto 2009-10-28 05:28:30

2

您無法將GIF文件(二進制)讀取到字符串變量中。您需要讀取字節數組。

2

您不想使用ReadToEnd(),即用於文本文件。嘗試File.ReadAllBytes(),它會將二進制文件讀入一個字節數組。然後,您可以使用File.WriteAllBytes()將該文件寫回磁盤。

0

string使用UTF16。我對嗎?

這意味着您的代碼將ASCII轉換爲UTF16。 :)

你也不明白@標誌的含義。如果你想避免雙反斜槓,將它放在字符串前面。您的代碼@"C:\\Hi.gif"應該是"C:\\Hi.gif"@"C:\Hi.gif"