在Xamarin Forms中将Byte[]数组转换为图像

9

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

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? - Jason
其实我也不知道... Constant.jsonPdf 包含的值是从服务器传来的。当我调试时,我只能看到 byte[694753] - Jestin Saji Chacko
1
你应该验证它 - 将其写入磁盘,然后使用图像查看器查看它,或使用curl或浏览器将其下载到桌面。如果它不是有效的图像类型,则不会在图像控件中显示。 - Jason
那么我该如何找出是否支持该格式? - Jestin Saji Chacko
如果byte[]不是有效的图像数据,无论您在保存时使用什么扩展名都没有关系。 - Jason
显示剩余4条评论
3个回答

11

(XAML):

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

viewModel.SImageBase64 是一个 byte[] 数组

后台代码(C#):

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

我只是按照这样做了,然后图片就显示出来了。


这个不起作用,并且在 Xamarin Github 和 Microsoft Devs 页面上已经被讨论了数百次,因为 ImageSource.FromStream() 要求在其 lambda 函数内创建一个全新的 MemoryStream。如果这对你起作用,那么你非常幸运,但是十有八九这个解决方案不会起作用。 - Matthew Swallow
稍微冗长但可行的方法类似于将MemoryStream转换为字节数组,然后在FromStream()的lambda函数中使用该字节数组创建另一个MemoryStream。 - Matthew Swallow

9

潜在的解决方案

我知道这个帖子已经两年了,但我想在这里发布一个可行的解决方案,以帮助那些也在遇到类似问题的人。我刚刚花了半天时间进行研究并尝试解决一个相同的问题,这篇文章中的代码几乎正确无误,你只需要将MemoryStream作为lambda函数的返回值提供给FromStream()方法即可。

将这个:

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

To:

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

代码:

这个片段应该在Xamarin Forms 5.0.0.2012版本中能够正常工作。

byte[] imageAsBytes = Constant.jsonPDF;

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

imagePanel.Children.Add(PdfImage);

1
感谢您的解决方案,它确实非常好用。我只需要将´imagePanel.Children.Add(PdfImage)´更改为´PdfImage.Source = ImageSource.FromStream(() => { return new MemoryStream(qrCodeAsBitmapByteArr); });´。没有您的答案,我就无法成功了。非常感谢您。编辑:对不起,我的错,您已经为我做了这件事,而我却忽略了它。 - user3772108
1
别担心!如果这有所帮助,请确保将该线程标记为已解决! - Matthew Swallow
我不是楼主,但我给了你一个赞。 :D - user3772108
1
@MatthewSwallow,stream1不再需要。 - jpcarts23
1
可以简化为: PdfImage.Source = ImageSource.FromStream(() => new MemoryStream(imageAsBytes)); - Abhijith C R
显示剩余4条评论

4
使用以下代码:
imgUserImage.Source = ImageSource.FromStream(() => new MemoryStream(userList.Single().ProfilePhoto));

这里的头像照片类型是byte[]

public byte[] ProfilePhoto { get; set; }

不鼓励只提供代码的答案。请点击[编辑]并添加一些概括您的代码如何回答问题的单词,或者解释您的答案与先前答案/答案的区别。 [来自审查] - Nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接