C# WPF/WinForms/GDI互操作:将可写位图转换为System.Drawing.Image?

C# WPF/WinForms/GDI互操作:将可写位图转换为System.Drawing.Image?,c#,wpf,winforms,writeablebitmap,winforms-interop,C#,Wpf,Winforms,Writeablebitmap,Winforms Interop,如何将WPF WriteableBitmap对象转换为System.Drawing.Image 我的WPF客户端应用程序将位图数据发送到web服务,web服务需要在该端构建System.Drawing.Image 我知道我可以获取可写位图的数据,并将信息发送到web服务: // WPF side: WriteableBitmap bitmap = ...; int width = bitmap.PixelWidth; int height = bitmap.PixelHeight; int[]

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

我的WPF客户端应用程序将位图数据发送到web服务,web服务需要在该端构建System.Drawing.Image

我知道我可以获取可写位图的数据,并将信息发送到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?
}
本博客展示了如何将WriteableBitmap编码为jpeg图像。也许这有帮助

如果确实要传输原始图像数据(像素),可以:

  • 创建一个具有正确大小的
  • 迭代原始数据,将原始数据转换为System.Drawing.Color(例如,通过),并通过设置新创建图像中的每个像素颜色

  • 我当然更喜欢第一种解决方案(博客文章中描述的解决方案)。

    如果位图数据未压缩,您可能可以使用此
    系统。绘图。位图
    构造函数:

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

    编辑:

    由于要将位图发送到web服务,我建议您首先对其进行编码。命名空间中有多个编码器。例如:

        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 ) );
    

    希望这能有所帮助。

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

    谢谢。我会仔细研究一下,看看这些是否有帮助。我的数据只是wpfWrite像素,返回int[]我用一个示例更新了我的答案,说明了如何在发送位图之前对其进行编码,以及如何在web服务中对其进行解码。