在Silverlight中,我能否从BitmapImage获取byte[]?

6
我正在尝试在Silverlight和WCF服务之间传递图像的表示。如果可能的话,我想传递一个System.Windows.Media.Imaging.BitmapImage,这样客户端就不需要进行任何转换。
但是,在某个时候,我需要将此图像存储在数据库中,这意味着图像表示必须能够转换为和从byte[]转换。我可以通过将数组读入MemoryStream并使用BitmapImage.SetSource()从byte[]创建一个BitmapImage。但似乎找不到从BitmapImage转换为byte[]的方法。这里有什么明显的遗漏吗?
如果有帮助的话,转换代码可以在服务器上运行,即它不需要在Silverlight中运行。

不是。该图像最初是通过用户在“打开对话框”中选择它来加载的。解决方法是访问openDialog.File.OpenRead,从该流创建BinaryReader,然后在读取器上调用ReadBytes()以获取Byte[]。我还没有跟上Silverlight 4的最新情况,现在可能已经有可用的解决方案了。 - goric
3个回答

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

我曾经遇到过同样的问题。 我找到了ImageTools库,它使得工作变得更加容易。

获取该库并引用它,然后

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

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

你链接的页面是关于.NET的,但是System.Windows.dll中的Silverlight版本的BitmapSource不支持这个方法:http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.bitmapsource%28VS.95%29.aspx - goric
哦,抱歉。我忘记了Silverlight和WPF还不完全相等。 - jrista

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接