2012-02-27 7 views
1

URLからイメージを取得しようとしていますが、ファイルに保存すると実際のイメージの半分になります! HttpWebRequest.BeginGetResponseのような多くのサイトやソリューションは、データをバッファリングする必要があると考えていたので検索しましたが、機能しませんでした。私が間違っていると、この問題を作っている私のコードのどの部分かわからない:(これはURLから画像を取得するコードですURLからイメージを取得しても完全にロードされていません

:!

public static Bitmap GetImageFromUrl(string url) 
    { 
     string RefererUrl = string.Empty; 
     int TimeoutMs = 22 * 1000; 
     string requestAccept = "*/*"; 
     string UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7"; 

     Bitmap img = null; 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 

     request.UserAgent = UserAgent; 
     request.Timeout = TimeoutMs; 
     request.ReadWriteTimeout = TimeoutMs * 6; 
     request.Accept = requestAccept; 

     if (!string.IsNullOrEmpty(RefererUrl)) 
     { 
      request.Referer = RefererUrl; 
     } 

     try 
     { 
      WebResponse wResponse = request.GetResponse(); 
      using (HttpWebResponse response = wResponse as HttpWebResponse) 
      { 
       Stream responseStream = response.GetResponseStream(); 
       img = new Bitmap(responseStream); 
       response.Close(); 
      } 
     } 
     catch (Exception) 
     { 
     } 
     return img; 
    } 

ファイルに画像を保存します。このコード:

 byte[] imgBytes = tile.Image; 
     using (MemoryStream ms = new MemoryStream(imgBytes)) 
     { 
      using (Image img = Image.FromStream(ms)) 
      { 
       ms.Dispose(); 
       Bitmap tempBmp = new Bitmap(img); 
       img.Dispose(); 

       string activeDir = Environment.CurrentDirectory; 
       string newPath = System.IO.Path.Combine(activeDir, "Images"); 
       System.IO.Directory.CreateDirectory(newPath); 

       newPath = System.IO.Path.Combine(newPath, tile.TileType.ToString()); 
       System.IO.Directory.CreateDirectory(newPath); 

       newPath = System.IO.Path.Combine(newPath, tile.Zoom.ToString()); 
       System.IO.Directory.CreateDirectory(newPath); 

       newPath = System.IO.Path.Combine(newPath, tile.X.ToString()); 
       System.IO.Directory.CreateDirectory(newPath); 

       newPath = System.IO.Path.Combine(newPath, tile.Y.ToString()); 
       System.IO.Directory.CreateDirectory(newPath); 

       string newFileName = "tile.png"; 
       newPath = System.IO.Path.Combine(newPath, newFileName); 

       tempBmp.Save(newPath, ImageFormat.Png); 
       tempBmp.Dispose(); 

答えて

1

あなたのコードはovercomplicatedようだ、あなたは本当にイメージを読んで、それを保存し直し必要ですあなたはこのように、直接ダウンロードした画像を保存することができないのはなぜ :?

 public static void GetImageFromUrl(string url) 
    { 
     string RefererUrl = string.Empty; 
     int TimeoutMs = 22 * 1000; 
     string requestAccept = "*/*"; 
     string UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7"; 

     // Bitmap img = null; 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 

     request.UserAgent = UserAgent; 
     request.Timeout = TimeoutMs; 
     request.ReadWriteTimeout = TimeoutMs * 6; 
     request.Accept = requestAccept; 

     if (!string.IsNullOrEmpty(RefererUrl)) 
     { 
      request.Referer = RefererUrl; 
     } 

     try 
     { 
      WebResponse wResponse = request.GetResponse(); 
      using (HttpWebResponse response = wResponse as HttpWebResponse) 
      { 
       Stream responseStream = response.GetResponseStream(); 
       BinaryReader br = new BinaryReader(responseStream); 

       FileStream fs = new FileStream(@"c:\pst\1.jpg", FileMode.Create, FileAccess.Write); 

       const int buffsize = 1024; 
       byte[] bytes = new byte[buffsize]; 
       int totalread = 0; 

       int numread = buffsize; 
       while (numread != 0) 
       { 
        // read from source 
        numread = br.Read(bytes, 0, buffsize); 
        totalread += numread; 

        // write to disk 
        fs.Write(bytes, 0, numread); 
       } 

       br.Close(); 
       fs.Close(); 


       response.Close(); 
      } 
     } 
     catch (Exception) 
     { 
     } 
    } 

もちろんメソッドに分割しなければならないとし、適切なリターンが

+0

それは働いた。どうもありがとうございました。なぜ私のコードが動作していないのかわかりません。 – Arash

+1

あなたのコードのどこかに小さな間違いがあるのを除けば、大きな問題は実際にイメージを読んでファイルに保存していたことでした。これにより、不要な画像の処理が行われ、別のファイルが保存されます(同じように見えますが、ダウンロードされるファイルはサーバー上のファイルとは異なります) –

1

値あなたが最後にそれをファイルに保存するまでは、msimgオブジェクトにDispose()を呼び出すべきではありません。

それが自動的に各使用ブロックの出口に配置されているので、彼らはこれが本当にusingを使用する主な理由である(あっても、自分のusingセクションで宣言されているので、あなたがすべてでそれらにDispose()を呼び出す必要はありません最初は!)。

関連する問題