【问题标题】:Windows 8.1 Runtime (C#) - Convert HttpResponseMessage content to BitmapImageWindows 8.1 运行时 (C#) - 将 HttpResponseMessage 内容转换为 BitmapImage
【发布时间】:2016-01-06 16:44:31
【问题描述】:

我正在向使用 MVVM 构建的 Windows Phone 8.1 RT 应用程序添加功能。我需要能够将图像下载到设备并保存/显示它。我已经可以对来自固定 URL 的图像执行此操作了。

我们有一个随附的网站和 API 与该应用程序一起使用。它的工作方式是应用程序向 API 发送请求以获取相关图像的下载代码,然后将此代码与文档 ID 一起发送到网站的请求中,以验证用户有权访问文件,如果成功,则应提供图像。该 API 和网站已与该应用的 iOS 和 Android 等效版本一起使用,因此我知道它们可以正常工作。

为了检索图像,我正在尝试使用 HttpClient。这是我当前的代码,它正在从服务器获得响应,其中包含一些内容和图像的文件名(看起来是正确的):

Uri uri = new Uri("<website address>");

Dictionary<string, string> pairs = new Dictionary<string, string>();                
pairs.Add("RequestToken", response.DownloadToken);
pairs.Add("DocumentID", "<doc ID>");

HttpFormUrlEncodedContent formContent = new HttpFormUrlEncodedContent(pairs);                             

HttpClient client = new HttpClient();
HttpResponseMessage response2 = await client.PostAsync(uri, formContent);

var imageContent = response2.Content.ReadAsInputStreamAsync();

我正在尝试将内容写入流,然后将其转换为 BitmapImage 对象,然后我可以将其保存到设备并显示给用户。这是我正在努力的转换。我的计划是将 InputStream 转换为字节数组,然后将其转换为位图。问题是,我在 8.1 中找不到任何可以做到这一点的扩展方法,而且几乎没有文档可以提供帮助。

任何人都可以在这里指出正确的方向吗?也许有更好的方法来进行从 HttpResponseMessage.Content 到 BitmapImage 的转换?

【问题讨论】:

  • 为什么不把流转成字节数组,再把字节数组转成位图图像呢?
  • 这就是我想要做的,但不幸的是我在 8.1 中无法解决
  • 感谢您的链接。实际上,我今天已经多次阅读该答案(这是我尝试过的许多术语的最佳 Google 结果),但我无法从中找到我需要的内容。例如,接受的答案建议创建一个 .NET Stream 对象,然后使用 HttpClient.GetStreamAsync 方法。但是 GetStreamAsync 对我不可用...我假设它是 8.0 方法,除非我缺少命名空间?我已经尝试了很多谷歌搜索来找出如何将 IInputStream 转换为字节数组,但还没有找到有效的解决方案
  • 您的应用是基于 Silverlight 还是 Win RT?

标签: c# windows-phone-8.1


【解决方案1】:

确保您正在导入正确的HttpClient

using Windows.Web.Http;

并导入其他必要的命名空间:

using Windows.Storage.Streams;
using Windows.UI.Xaml.Media.Imaging;

然后,正如您在查询中所写,获取 IInputStream,但请确保将 awaitReadAsInputStreamAsync() 一起使用: p>

HttpClient client = new HttpClient();
HttpResponseMessage response = await client.PostAsync(uri, formContent);

// Do not forget to use an 'await'.
IInputStream imageStream = await response.Content.ReadAsInputStreamAsync();

然后,将 IInputStream 复制到 IRandomAccessStream 中:

InMemoryRandomAccessStream randomAccessStream =
    new InMemoryRandomAccessStream();
await RandomAccessStream.CopyAsync(imageStream, randomAccessStream);

这很重要,倒带 IRandomAccessStream

// Rewind.
randomAccessStream.Seek(0);

最后,创建一个 BitmapImage 并将其分配给您的 XAML Image 控件:

var bitmap = new BitmapImage();
bitmap.SetSource(randomAccessStream);

MyImage.Source = bitmap;

就是这样!

如果你需要一个 URI 来测试,试试这个:

Uri uri = new Uri("http://heyhttp.org/emoji.png");
HttpResponseMessage response = await client.GetAsync(uri);

【讨论】:

  • 完美的解释,正是我所追求的!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-14
  • 1970-01-01
相关资源
最近更新 更多