【问题标题】:Get an Image from a URL but it is not loaded completely从 URL 获取图像,但未完全加载
【发布时间】:2012-03-16 18:18:33
【问题描述】:

我正在尝试从 URL 获取图像,但是当我将其保存到文件时,它是实际图像的一半!我搜索了许多站点和解决方案,例如 HttpWebRequest.BeginGetResponse,因为我认为这是因为我必须缓冲数据但它不起作用。我不知道我的代码的哪一部分是错误的并造成了这个问题!:(

这是从 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();

【问题讨论】:

    标签: c# image http httpwebrequest httpwebresponse


    【解决方案1】:

    在将msimg 对象保存到文件末尾之前,不应调用Dispose()

    它们甚至在自己的 using 部分中声明,因此您根本不需要对它们调用 Dispose(),因为它会在每个使用的块的出口处自动释放(这确实是主要原因首先使用using!)。

    【讨论】:

      【解决方案2】:

      您的代码似乎过于复杂,您真的需要读取图像然后重新保存吗? 为什么不能直接保存下载的图片,像这样:

              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)
              {
              }
          } 
      

      您当然应该将其拆分为方法并设置正确的返回值

      【讨论】:

      • 成功了。非常感谢。我不知道为什么我的代码不起作用。
      • 除了代码中的小错误之外,最大的问题是您实际上是在读取图像然后将其保存到文件中。这将导致对图像进行不必要的处理并保存另一个文件(看起来相同,但下载的文件与服务器上的文件不同)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 2013-05-30
      • 2018-10-23
      • 2011-09-28
      相关资源
      最近更新 更多