Can I get a byte[] from a BitmapImage in Silverlight?

arrays, bitmapimage, c#, silverlight

Solution

Use this:

public byte[] GetBytes(BitmapImage bi)
{
    WriteableBitmap wbm = new WriteableBitmap(bi);
    return wbm.ToByteArray();
}

Where

public static byte[] ToByteArray(this WriteableBitmap bmp)
{
    // Init buffer
    int w = bmp.PixelWidth;
    int h = bmp.PixelHeight;
    int[] p = bmp.Pixels;
    int len = p.Length;
    byte[] result = new byte[4 * w * h];

    // Copy pixels to buffer
    for (int i = 0, j = 0; i < len; i++, j += 4)
    {
        int color = p[i];
        result[j + 0] = (byte)(color >> 24); // A
        result[j + 1] = (byte)(color >> 16); // R
        result[j + 2] = (byte)(color >> 8);  // G
        result[j + 3] = (byte)(color);       // B
    }

    return result;
}

Problem

I'm trying to pass some representation of an image back and forth between Silverlight and a WCF service. If possible I'd like to pass a `System.Windows.Media.Imaging.BitmapImage`, since that would mean the client doesn't have to do any conversion. However, at some point I need to store this image in a database, meaning the image representation must be able to convert to and from `byte[]`. I can create a `BitmapImage` from a `byte[]` by reading the array into a `MemoryStream` and using `BitmapImage.SetSource()`. But I can't seem to find a way to convert the other way - from `BitmapImage` to `byte[]`. Am I missing something obvious here? If it helps at all, the conversion code could run on the server, i.e. it doesn't need to be Silverlight-safe.

Original source