I have a problem. I want to convert BitmapImage into byte[] array and back.
I wrote these methods:
public static byte[] ToByteArray(this BitmapImage bitmapImage)
{
byte[] bytes;
using (MemoryStream ms = new MemoryStream())
{
bitmapImage.BeginInit();
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.StreamSource.CopyTo(ms);
bitmapImage.EndInit();
bytes = ms.ToArray();
}
return bytes;
}
public static BitmapImage ToBitmapImage(this byte[] bytes, int width, int height)
{
BitmapImage bitmapImage = new BitmapImage();
using (MemoryStream ms = new MemoryStream(bytes))
{
ms.Position = 0;
bitmapImage.BeginInit();
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.StreamSource = ms;
bitmapImage.EndInit(); // HERE'S AN EXCEPTION!!!
}
return bitmapImage;
}
First one works fine, but when I try to convert from byte[] into BitmapImage I got a NotSupportedException… Why? How to correct the code of the 2nd method?
There are two problems with your
ToByteArraymethod.First it calls
BeginInitandEndIniton an already initialized BitmapImage instance. This is not allowed, see the Exceptions list in BeginInit.Second, the method could not be called on a BitmapImage that was created from an Uri instead of a Stream. Then the
StreamSourceproperty would benull.I suggest to implement the method like shown below. This implementation would work for any BitmapSource, not only BitmapImages. And you are able to control the image format by selecting an appropriate BitmapEncoder, e.g.
JpegBitmapEncoderinstead ofPngBitmapEncoder.An image buffer returned by this
ToByteArraymethod can always be converted back to a BitmapImage by yourToBitmapImagemethod.And please note that the width and height arguments of your
ToBitmapImagemethod are currently unused.UPDATE
An alternative implementation of the decoding method could look like shown below, although it does not return a BitmapImage but only an instance of the base class BitmapSource. You may however change the return type to BitmapFrame.