c# - 如何使用 winforms 从 Web 下载显示下载进度的图像?

标签 c# winforms image httpwebrequest

我以这种方式使用 WebRequest 从 URL 异步下载图像:

public void Download(string url)
{   
  byte[] buffer = new byte[0x1000];
  WebRequest request = HttpWebRequest.Create(url);
  request.Method = "GET";
  request.ContentType = "image/gif";

  request.BeginGetResponse(result =>
  {
    WebRequest webRequest = result.AsyncState as WebRequest;

    WebResponse response = webRequest.EndGetResponse(result);
    ReadState readState = new ReadState()
    {
      Response = response.GetResponseStream(),
      AccumulatedResponse = new MemoryStream(),
      Buffer = buffer,
    };

    readState.Response.BeginRead(buffer, 0,
      readState.Buffer.Length, ReadCallback, readState);
  }, request);
}

public void ReadCallback(IAsyncResult result)
{
  ReadState readState = result.AsyncState as ReadState;
  int bytesRead = readState.Response.EndRead(result);
  if(bytesRead > 0)
  {
    readState.AccumulatedResponse.BeginWrite(readState.Buffer, 0, bytesRead, writeResult =>
    {
      readState.AccumulatedResponse.EndWrite(writeResult);
      readState.Response.BeginRead(readState.Buffer, 0, readState.Buffer.Length, ReadCallback, readState);
    }, null);
  }
  else
  {
    readState.AccumulatedResponse.Flush();
    readState.Response.Close();
    pictureBox1.Image = Image.FromStream(readState.AccumulatedResponse);
  }
}

public class ReadState
{
  public Stream Response { get; set; }
  public Stream AccumulatedResponse { get; set; }
  public byte[] Buffer { get; set; }
}

它工作正常,但我想像浏览器一样显示下载进度,而不是仅在完成时显示。

如果我这样做

pictureBox1.Image = Image.FromStream(readState.AccumulatedResponse);

在它完成之前我得到一个异常,该图片无效,即使它有一些数据。 反正有显示部分数据吗?

最佳答案

JPEG 有一种称为“Progressive JPEG”的特殊编码模式,在这种模式下,数据被多次压缩,细节逐渐增加。 Windows 7 有 built-in support为此。

关于c# - 如何使用 winforms 从 Web 下载显示下载进度的图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/792544/

相关文章:

c# - 如何更改列表框选择背景颜色?

c# - 可以更改悬停间隔吗?

image - 对燃气表进行 OCR 识别

css - 如何为 960 网格网页设计调整图像大小?

c# - wcf新手问题: arrays as properties

c# - ASP.NET MVC 论坛?

c# - 如何在动态 `textboxes` 上创建事件

python - 为什么在循环调用时 plt.savefig() 性能会下降?

c# - Xamarin Android - OutOfMemoryError 异常 - 大图

c# - 无法从我的 .Net Web 服务返回对象