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.
To convert a byte array to an image. Create a ByteArrayInputStream object by passing the byte array (that is to be converted) to its constructor. Read the image using the read() method of the ImageIO class (by passing the ByteArrayInputStream objects to it as a parameter).
In addition, you can simply convert byte array to Bitmap . var bmp = new Bitmap(new MemoryStream(imgByte)); You can also get Bitmap from file Path directly. Save this answer.
A consecutive sequence of variables of the data type byte, in computer programming, is known as a byte array. An array is one of the most basic data structures, and a byte is the smallest standard scalar type in most programming languages.
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;
}
I had the same issue. I found the ImageTools library that makes thte job way easier.
Get the library and reference it and then
using (var writingStream = new MemoryStream())
{
var encoder = new PngEncoder
{
IsWritingUncompressed = false
};
encoder.Encode(bitmapImageInstance, writingStream);
// do something with the array
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With