C# 我可以从Silverlight中的BitmapImage获取字节[]吗?

C# 我可以从Silverlight中的BitmapImage获取字节[]吗?,c#,silverlight,bytearray,bitmapimage,C#,Silverlight,Bytearray,Bitmapimage,我试图在Silverlight和WCF服务之间来回传递一些图像表示。如果可能,我希望传递一个System.Windows.Media.Imaging.BitmapImage,因为这意味着客户端不必进行任何转换 但是,在某个时候,我需要将此图像存储在数据库中,这意味着图像表示必须能够在字节[]之间进行转换。我可以通过将数组读入MemoryStream并使用BitmapImage.SetSource()从字节[]创建BitmapImage。但我似乎找不到另一种方法来转换,从BitmapImage到b

我试图在Silverlight和WCF服务之间来回传递一些图像表示。如果可能,我希望传递一个
System.Windows.Media.Imaging.BitmapImage
,因为这意味着客户端不必进行任何转换

但是,在某个时候,我需要将此图像存储在数据库中,这意味着图像表示必须能够在
字节[]
之间进行转换。我可以通过将数组读入
MemoryStream
并使用
BitmapImage.SetSource()
字节[]
创建
BitmapImage
。但我似乎找不到另一种方法来转换,从
BitmapImage
byte[]
。我是不是漏掉了什么明显的东西

如果有帮助,转换代码可以在服务器上运行,也就是说,它不需要是Silverlight安全的。

尝试使用。可以将位图数据复制到字节数组中。然而,老实说,我不确定像素的格式是什么…它可能取决于最初加载的图像类型

使用以下命令:

public byte[] GetBytes(BitmapImage bi)
{
    WriteableBitmap wbm = new WriteableBitmap(bi);
    return wbm.ToByteArray();
}
在哪里

publicstaticbyte[]ToByteArray(此可写bitmap bmp)
{
//初始化缓冲区
int w=bmp.PixelWidth;
int h=bmp.PixelHeight;
int[]p=bmp.像素;
int len=p.长度;
字节[]结果=新字节[4*w*h];
//将像素复制到缓冲区
对于(int i=0,j=0;i>24);//A
结果[j+1]=(字节)(颜色>>16);//R
结果[j+2]=(字节)(颜色>>8);//G
结果[j+3]=(字节)(颜色);//B
}
返回结果;
}
我也有同样的问题。 我发现这样做更容易

获取库并引用它,然后

                        using (var writingStream = new MemoryStream())
                        {
                            var encoder = new PngEncoder
                            {
                                IsWritingUncompressed = false
                            };
                            encoder.Encode(bitmapImageInstance, writingStream);
                            // do something with the array
                        }

您链接到的页面通常是针对.NET的,Silverlight版本的BitmapSource(在System.Windows.dll中)不支持此方法:哦,抱歉。我忘了Silverlight和WPF还不完全相等。你有没有找到解决方案?没有。最初是通过用户在打开的对话框中选择图像来加载图像的。解决方法是访问openDialog.File.OpenRead,从该流创建一个BinaryReader,然后在读取器上调用ReadBytes()以获取字节[]。我一直没有跟上Silverlight 4的进度,现在可能有一个解决方案。
                        using (var writingStream = new MemoryStream())
                        {
                            var encoder = new PngEncoder
                            {
                                IsWritingUncompressed = false
                            };
                            encoder.Encode(bitmapImageInstance, writingStream);
                            // do something with the array
                        }