2009-12-05 46 views
6

我想在Silverlight和WCF服务之间来回传递图像的某种表示形式。如果可能的话,我想通过System.Windows.Media.Imaging.BitmapImage,因为这意味着客户端不必进行任何转换。我可以从Silverlight中的BitmapImage获取一个字节[]吗?

然而,在某些时候,我需要这个图像存储在数据库中,这意味着图像表示必须能够转换和从byte[]。我可以通过读取阵列分成MemoryStream和使用BitmapImage.SetSource()创建从一个byte[]BitmapImage。但我似乎无法找到转换方式 - 从BitmapImagebyte[]。我在这里错过了很明显的东西吗

如果它有助于在所有的转换代码可以在服务器上运行,即,它并不需要Silverlight的安全。

+0

你有没有得到一个解决方案? – 2010-05-10 14:00:04

+0

不是。图像最初是通过用户在打开的对话框中选择它加载的。解决方法是访问openDialog.File.OpenRead,从该流创建BinaryReader,然后在读取器上调用ReadBytes()以获取字节[]。我一直没有跟上Silverlight 4,现在可能有一个解决方案。 – goric 2010-05-25 02:20:36

回答

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; 
} 
0

尝试使用CopyPixels。您可以将位图数据复制到一个字节数组。但是,我真的不确定像素的格式是什么......它可能取决于最初加载的图像类型。

+0

您链接的页面一般用于.NET,BitmapSource的Silverlight版本(在System.Windows.dll中)不支持此方法:http://msdn.microsoft.com/zh-cn/library/system .windows.media.imaging.bitmapsource%28VS.95%29.aspx – goric 2009-12-05 03:11:13

+0

哦,道歉。我忘了Silverlight和WPF还不完全相同。 – jrista 2009-12-05 03:28:45

1

我有同样的问题。 我发现ImageTools library可以让你的工作更轻松。

获取图书馆和参考,然后

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