我正在尝试在Silverlight和WCF服务之间来回传递一些图像。如果可能的话,我想传递一个System.Windows.Media.Imaging.BitmapImage
,因为这意味着客户不需要进行任何转换。
但是,在某些时候我需要将此图像存储在数据库中,这意味着图像表示必须能够转换为byte[]
和从BitmapImage
转换。我可以通过将数组读入byte[]
并使用MemoryStream
从BitmapImage.SetSource()
创建BitmapImage
。但我似乎无法找到另一种转换方式 - 从byte[]
到{{1}}。我错过了一些明显的东西吗?
如果它有帮助,转换代码可以在服务器上运行,即它不需要是Silverlight安全的。
答案 0 :(得分:6)
使用此:
public byte[] GetBytes(BitmapImage bi)
{
WriteableBitmap wbm = new WriteableBitmap(bi);
return wbm.ToByteArray();
}
其中
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;
}
答案 1 :(得分:1)
我有同样的问题。 我发现ImageTools library使得工作变得更容易。获取库并引用它然后
using (var writingStream = new MemoryStream())
{
var encoder = new PngEncoder
{
IsWritingUncompressed = false
};
encoder.Encode(bitmapImageInstance, writingStream);
// do something with the array
}
答案 2 :(得分:0)
尝试使用CopyPixels。您可以将位图数据复制到字节数组。但是,老实说我不确定像素的格式是什么......它可能取决于最初加载的图像类型。