【问题标题】:Convert A Byte[] Array to Image in Xamarin Forms将 Byte[] 数组转换为 Xamarin 表单中的图像
【发布时间】:2017-04-21 13:17:16
【问题描述】:

在问这个问题之前,我搜索了很多,但找不到适合我的解决方案。

Xamarin.Forms 中,我有一个byte[] 数组,我想将该byte[] 数组转换为Image。我怎样才能做到这一点,这是我尝试过的:

在前端(XAML)中:

<StackLayout BackgroundColor="Olive" x:Name="imagePanel">
    <Image x:Name="PdfImage" Aspect="AspectFill" IsVisible="true"/>
</StackLayout>   

在代码背后(C#)中:

byte[] imageAsBytes = Constant.jsonPDF;

var stream1 = new MemoryStream(imageAsBytes);
PdfImage.Source = ImageSource.FromStream(() => new MemoryStream(imageAsBytes));

imagePanel.Children.Add(PdfImage);

但我的问题是图像不显示。

谁能告诉我我做错了什么。任何帮助将不胜感激。

【问题讨论】:

  • byte[] 是 jpg 还是 png?
  • 其实我不知道...Constant.jsonPdf 包含值并且来自服务器。当我调试时,我只能看到byte[694753]
  • 您应该验证 - 将其写入磁盘,然后使用图像查看器查看,或者使用 curl 或浏览器将其下载到您的桌面。如果它不是有效的图像类型,它将不会显示在图像控件中
  • 好的,谢谢...我使用DependencyService 将字节数组保存到图库,但我只得到一个空白屏幕;(
  • 这听起来像是一张糟糕的图片,或者是某种不受支持的格式

标签: arrays image xamarin.forms image-conversion


【解决方案1】:

(XAML):

 <Image Grid.Row="1" x:Name="IncidentImageData" Grid.ColumnSpan="4" BackgroundColor="DarkGray" Aspect="AspectFill" WidthRequest="50" HeightRequest="175"/> 

viewModel.SImageBase64 是一个字节[]

代码背后(C#):

var stream1 = new MemoryStream(viewModel.SImageBase64);
IncidentImageData.Source = ImageSource.FromStream(() => stream1);

只是我已经这样做了,并且图像已显示。

【讨论】:

  • 这不起作用,并且在 Xamarin Github 和 Microsoft Devs 页面上被谈论了数百次,因为ImageSource.FromStream() 需要在它的 lambda 函数中创建一个全新的 MemoryStream。如果这对您有用,您将非常幸运,但十分之有 9 次此解决方案不起作用。
  • 有点冗长,但与此类似的工作方式是将 MemoryStream 转换为字节数组,然后使用该字节数组在 FromStream() 的 lambda 函数中创建另一个 MemoryStream
【解决方案2】:

潜在的修复

我知道这个帖子已经有 2 年历史了,但我想我会在这里为那些也在为此苦苦挣扎的人发布一个可行的解决方案。刚刚花了半天时间研究并尝试解决一个相同的问题,这篇文章中的代码编写方式对我帮助很大,因为它几乎 100% 正确。您只需提供 MemoryStream 作为 FromStream() 方法中的 lambda 函数的返回值。

改变这个:

PdfImage.Source = ImageSource.FromStream(() => new MemoryStream(imageAsBytes));

收件人:

PdfImage.Source = ImageSource.FromStream(() =>
{
     return new MemoryStream(imageAsBytes);
});

并且 sn-p 应该从 Xamarin Forms 5.0.0.2012 开始工作

完整代码:

byte[] imageAsBytes = Constant.jsonPDF;

var stream1 = new MemoryStream(imageAsBytes);
PdfImage.Source = ImageSource.FromStream(() =>
{
     return new MemoryStream(imageAsBytes);
});

imagePanel.Children.Add(PdfImage);

【讨论】:

  • 感谢您的解决方案,它确实工作得很好。我只需要将 'imagePanel.Children.Add(PdfImage)' 更改为 'PdfImage.Source = ImageSource.FromStream(() => { return new MemoryStream(qrCodeAsBitmapByteArr); });'。没有您的回答,我将无法成功。非常感谢。编辑:我的错,你已经这样做了,我忽略了它。
  • 别担心!如果这有帮助,请务必将线程标记为已解决!
  • 我不是 OP,但我给了你一个赞成票。 :D
  • @MatthewSwallow ,不再需要stream1
  • 可以简化为 - PdfImage.Source = ImageSource.FromStream(() => new MemoryStream(imageAsBytes));
【解决方案3】:

使用此代码:

imgUserImage.Source = ImageSource.FromStream(() => new MemoryStream(userList.Single().ProfilePhoto));

这里头像类型是byte[]

public byte[] ProfilePhoto { get; set; }

【讨论】:

  • 不鼓励仅使用代码的答案。请单击edit 并添加一些词来总结您的代码如何解决问题,或者解释您的答案与之前的答案/答案有何不同。 From Review
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 2015-05-23
  • 2011-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多