tags:

views:

1095

answers:

2

I'm able to convert a byte[] to an image:

byte[] myByteArray = ...;  // ByteArray to be converted

MemoryStream ms = new MemoryStream(my);
BitmapImage bi = new BitmapImage();
bi.SetSource(ms);

Image img = new Image();
img.Source = bi;

But I'm not able to convert the Image back to a byte[]! I found in the Internet a solution, that works for WPF:

var bmp = img.Source as BitmapImage;
int height = bmp.PixelHeight;
int width  = bmp.PixelWidth;
int stride = width * ((bmp.Format.BitsPerPixel + 7) / 8);

byte[] bits = new byte[height * stride];
bmp.CopyPixels(bits, stride, 0);

The Silverlight libary is so tiny that the class BitmapImage has no property called Format!

Has anybody an idea which solves my problem.

I searched in the internet for a long time to find a solution, but there are is no solution, which works in silverlight!

Thanks!

+2  A: 

There is no solution that works in Silverlight by design. Images can be retrieved without the need to conform to any cross domain access policy as other http requests have to. The basis of this relaxation of the cross domain rules is that the data making up the image cannot be be retrieved in the raw. It can only be used as an image.

If you want to simply write to and read from a bitmap image use the WriteableBitmap class instead of BitmapImage. The WriteableBitmap exposes a Pixels property not available on the BitmapImage.

AnthonyWJones
+2  A: 

(the bits per pixel method you are missing just details how the color information is stored per pixel)

As anthony suggested, a WriteableBitmap would be the easiest way - check out http://kodierer.blogspot.com/2009/11/convert-encode-and-decode-silverlight.html for a method to get an argb byte array out :

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;
}
Chris B