问题
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.
回答1:
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;
}
回答2:
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
}
回答3:
Try using CopyPixels. You can copy the bitmap data to a byte array. However, I am honestly not sure what the format of the pixels would be...its probably dependent upon the kind of image that was originally loaded.
来源:https://stackoverflow.com/questions/1850993/can-i-get-a-byte-from-a-bitmapimage-in-silverlight