9

Before asking this question I googled a lot but couldn't find a solution that suits mine.

In Xamarin.Forms I have a byte[] array and I want to Convert that byte[] array to an Image. How can I achieve that, this is what I tried:

In Front End(XAML):

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

In Code Behind(C#):

byte[] imageAsBytes = Constant.jsonPDF;

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

imagePanel.Children.Add(PdfImage);

But My problem is image is not displaying.

Can anybody tell me what I'm doing wrong. Any help would be greatly appreciated.

Narendra Jadhav
  • 10,052
  • 15
  • 33
  • 44
Jestin Saji Chacko
  • 113
  • 1
  • 1
  • 9

3 Answers3

11

(XAML):

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

viewModel.SImageBase64 is a byte[]

Code Behind(C#):

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

simply i have done like this and image has shown.

Ganesh Kumar
  • 708
  • 6
  • 25
  • This doesn't work and is spoken about hundreds of times on the Xamarin Github and Microsoft Devs pages because `ImageSource.FromStream()` requires a brand new MemoryStream to be created within it's lambda function. You're very lucky if this worked for you but 9 times out of 10 this solution won't work. – Matthew Swallow Jun 28 '21 at 18:33
  • The slightly more long winded, but working way of doing it similarly to this is by converting the MemoryStream to a byte array and then using that byte array to create another MemoryStream within the lambda function of FromStream() – Matthew Swallow Jun 28 '21 at 19:28
9

A Potential Fix

I know this thread is 2 years old now but I thought i'd post a working solution here for anyone who's also struggling with this. Just spent half a day researching and trying to solve an identical problem, the way the code was written on this post helped me greatly as it is almost 100% correct. You just need to provide the MemoryStream as a return from a lambda function within the FromStream() method.

Change this:

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

To:

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

And the snippet should be working as of Xamarin Forms 5.0.0.2012

Full Code:

byte[] imageAsBytes = Constant.jsonPDF;

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

imagePanel.Children.Add(PdfImage);
chri3g91
  • 1,196
  • 14
  • 16
Matthew Swallow
  • 179
  • 1
  • 11
4

Use this Code :

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

Here profile photo type is byte[]

public byte[] ProfilePhoto { get; set; }
Chandra Shakar
  • 126
  • 2
  • 8
  • Code-only answers are discouraged. Please click on [edit] and add some words summarising how your code addresses the question, or perhaps explain how your answer differs from the previous answer/answers. [From Review](https://stackoverflow.com/review/late-answers/22067253) – Nick Jan 30 '19 at 06:01