【问题标题】:WPF/WinForms/GDI interop: converting a WriteableBitmap to a System.Drawing.Image?WPF/WinForms/GDI 互操作:将 WriteableBitmap 转换为 System.Drawing.Image?
【发布时间】:2010-07-13 16:53:17
【问题描述】:

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

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

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

// WPF side:

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

myWebService.CreateBitmap(width, height, pixels);

但是在网络服务端,我不知道如何从这些数据中创建一个 System.Drawing.Image。

// Web service side:

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

【问题讨论】:

    标签: c# wpf winforms writeablebitmap winforms-interop


    【解决方案1】:

    此博客post 展示了如何将 WriteableBitmap 编码为 jpeg 图像。也许这有帮助?

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

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

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

    【讨论】:

    • 谢谢。我会到处玩,看看有没有帮助。
    【解决方案2】:

    如果您的位图数据未压缩,您可以使用这个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[]
    • 我已经用一个示例更新了我的答案,说明如何在发送位图之前对其进行编码,以及如何在 Web 服务中对其进行解码。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      相关资源
      最近更新 更多