2

如何将 WPF WriteableBitmap 对象转换为 System.Drawing.Image?

我的 WPF 客户端应用程序将位图数据发送到 Web 服务,并且 Web 服务需要在该端构造一个 System.Drawing.Image。

我知道我可以获取 WriteableBitmap 的数据,将信息发送到 Web 服务:

// WPF side:

WriteableBitmap bitmap = ...;
int width = bitmap.PixelWidth;
int height = bitmap.PixelHeight;
int[] pixels = bitmap.Pixels;

myWebService.CreateBitmap(width, height, pixels);

但是在 Web 服务端,我不知道如何根据这些数据创建 System.Drawing.Image。

// Web service side:

public void CreateBitmap(int[] wpfBitmapPixels, int width, int height)
{
   System.Drawing.Bitmap bitmap = ? // How can I create this?
}
4

3 回答 3

3

这篇博文展示了如何将 WriteableBitmap 编码为 jpeg 图像也许这有帮助?

如果您真的想传输原始图像数据(像素),您可以:

  1. 创建具有正确大小的System.Drawing.Bitmap
  2. 遍历您的原始数据,将原始数据转换为 System.Drawing.Color(例如通过Color.FromArgb()并通过SetPixel()设置新创建的图像中的每个像素颜色

我肯定更喜欢第一个解决方案(博客文章中描述的那个)。

于 2010-07-13T17:41:12.200 回答
3

如果您的位图数据未压缩,您可能会使用此System.Drawing.Bitmap构造函数:Bitmap(Int32, Int32, Int32, PixelFormat, IntPtr)

如果位图编码为 jpg 或 png,MemoryStream则从位图数据创建一个,并将其与Bitmap(Stream)构造函数一起使用。

编辑:

由于您要将位图发送到 Web 服务,因此我建议您首先对其进行编码。System.Windows.Media.Imaging命名空间中有几个编码器。例如:

    WriteableBitmap bitmap = ...;
    var stream = new MemoryStream();               
    var encoder = new JpegBitmapEncoder(); 
    encoder.Frames.Add( BitmapFrame.Create( bitmap ) ); 
    encoder.Save( stream ); 
    byte[] buffer = stream.GetBuffer(); 
    // Send the buffer to the web service   

在接收端,简单地说:

    var bitmap = new System.Drawing.Bitmap( new MemoryStream( buffer ) );

希望有帮助。

于 2010-07-14T08:53:07.563 回答
0

问题是针对 WPF 的,并且Pixels似乎不是WriteableBitmap. 这里的一些答案指向 SilverLight 文章,所以我怀疑这可能是 WPF 和 SilverLight 之间的区别。

于 2013-02-12T21:47:33.083 回答