从互联网下载图像并在 WinRT 中将其转换为 byte[]

Tom*_*ove 1 c# wpf windows-runtime

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

不幸的是,当我尝试处理此代码时,它在字节数组初始化时崩溃,因为流不可查找。

有什么办法可以做到这一点吗?我已经红色了,还没有可以在 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;
        }
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 5

你的问题是这一行:

result = new byte[imageStream.Length];
Run Code Online (Sandbox Code Playgroud)

对于 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

PS 我建议您使用HttpClient而不是HttpWebRequest.