从Internet下载图像并将其转换为WinRT中的byte []

时间:2012-06-27 12:40:20

标签: c# wpf windows-runtime

我正在尝试通过网址将图像从网上下载到我的Windows8应用程序并将其转换为字节[]。 (BitmapImage不可序列化)

不幸的是,当我尝试处理这段代码时,它会因为Stream不可搜索而在bytearray初始化时崩溃。

有没有办法实现这个目标?我已经知道在WinRT中还没有可用的流......

private async Task<byte[]> DownloadImageFromWebsite(string url)
        {
            //BitmapImage result = null;
            byte[] result = null;

            try
            {
                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);

                WebResponse response = await request.GetResponseAsync();

                Stream imageStream = response.GetResponseStream();
                result = new byte[imageStream.Length];
                await imageStream.ReadAsync(result, 0, (int)imageStream.Length);


                response.Dispose();
            }
            catch (Exception ex)
            {
                return null;
            }

            return result;
        }

1 个答案:

答案 0 :(得分:3)

你的问题就在这一行:

result = new byte[imageStream.Length];

对于HTTP响应流,在读取之前,您不知道它有多大。

如果服务器发送Content-Length标头,那么您应该能够读取它并使用它来调整阵列的大小。但是,你仍然需要回到将整个流(未知大小)读入内存,如下:

private async Task<byte[]> DownloadImageFromWebsiteAsync(string url)
{
  try
  {
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
    using (WebResponse response = await request.GetResponseAsync())
    using (var result = new MemoryStream())
    {
      await imageStream.CopyToAsync(result);
      return result.ToArray();
    }
  }
  catch (WebException ex)
  {
    return null;
  }
}

P.S。我建议您使用HttpClient代替HttpWebRequest