Converting Byte[] to Image type in C# for Windows Phone 7

I am having a problem converting a Byte array into an Image type for displaying in an application on Windows Phone 7.

The data is retrieved from a server, and when I upload and download the data it works fine, but I am struggling when converting it back into an Image format.

Can anyone shed some light on this issue for me?

This is my method for turning the Byte array into a BitmapImage,

public BitmapImage decodeImage(byte[] array)
{
    MemoryStream ms = new MemoryStream(array, 0, array.Length);

    // Convert byte[] to Image
    ms.Write(array, 0, array.Length);

    BitmapImage bitmapImage = new BitmapImage();
    bitmapImage.SetSource(ms);

    return bitmapImage;
}    

Then this is the code where I try to set the returned BitmapImage to the source for the Image box I am using in the XAML UI.

BitmapImage usrIMG = new BitmapImage();
usrIMG = getJson.decodeImage(userProfile.Photos[0].Image);
profileImage.Source = usrIMG;

I know the code looks mishmashed, and I am declaring things that I dont need to, i have been fiddling with it for ages and I am completely at a loss.

Many Thanks

Upvotes: 3

Views: 11990

Answers (4)

Belal Ghanem
Belal Ghanem

Reputation: 107

public BitmapImage ByteArraytoBitmap(Byte[] byteArray)
        {
            MemoryStream stream = new MemoryStream(byteArray);
            BitmapImage bitmapImage = new BitmapImage();
            bitmapImage.SetSource(stream);
            return bitmapImage;
        }

i used this code before and it's work 100% successfuly.

Upvotes: 1

albatross
albatross

Reputation: 455

var bitmapImage = new BitmapImage();

bitmapImage.SetSource(new MemoryStream(..Binary array Data..));

img1.Source = bitmapImage;

Upvotes: 1

Stefan Wick  MSFT
Stefan Wick MSFT

Reputation: 13850

the following code works fine for me in a quick test for your scenario of using the PhotoChooserTask, and store the selected image in a byte array. You also might want to review your code where you store and retrieve the byte array on your side, to make sure nothing gets lost there.

private byte[] imageBytes;
private void GetPhoto_Click(object sender, RoutedEventArgs e)
{
    PhotoChooserTask photoTask = new PhotoChooserTask();
    photoTask.Completed += new EventHandler<PhotoResult>(photoTask_Completed);
    photoTask.Show();
}

void photoTask_Completed(object sender, PhotoResult e)
{
    imageBytes = new byte[e.ChosenPhoto.Length];
    e.ChosenPhoto.Read(imageBytes, 0, imageBytes.Length);

    // save 'imageBytes' byte array to data base ...
}

private void ShowPhoto_Click(object sender, RoutedEventArgs e)
{
    // load 'imageBytes' byte array to data base ...
    BitmapImage bitmapImage = new BitmapImage();
    MemoryStream ms = new MemoryStream(imageBytes);
    bitmapImage.SetSource(ms);
    myImageElement.Source = bitmapImage;
}

Upvotes: 8

Matt Lacey
Matt Lacey

Reputation: 65564

You'll need a WritableBitmap and to know the height and width of the image to be able to do this.
Then you can do something like this:

var result = new WriteableBitmap(width, height);
var ms = new MemoryStream();
ms.Write(myByteArray, myByteArray, myByteArray.Length);
result.SetSource(ms);

Upvotes: 1

Related Questions