WPF/WinForms/GDI互操作:将WriteableBitmap转换为System.Drawing.Image?

3

我如何将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?
}
3个回答

4
如果您的位图数据未经压缩,您可以使用此 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 ) );

希望这有所帮助。

我的数据就是 wpfWriteableBitmap.Pixels,它返回一个 int[]。 - Judah Gabriel Himango
我已经更新了我的答案,提供了一个在发送位图之前如何进行编码以及在 Web 服务中如何解码的示例。 - Danko Durbić

4
这篇博客post展示了如何将您的WriteableBitmap编码为jpeg图像。也许这可以帮助您?
如果您真的想传输原始图像数据(像素),您可以:
  1. 创建一个大小正确的System.Drawing.Bitmap
  2. 遍历您的原始数据,将原始数据转换为System.Drawing.Color(例如通过Color.FromArgb()),并通过SetPixel()设置新创建的图像中的每个像素颜色。
我肯定更喜欢第一种解决方案(博客文章中描述的解决方案)。

谢谢。我会试一试看这些是否有所帮助。 - Judah Gabriel Himango

0
问题是关于WPF的,Pixels似乎不是WriteableBitmap的属性。这里的一些答案指向SilverLight文章,所以我怀疑这可能是WPF和SilverLight之间的差异。

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