如何将 UWP SoftwareBitmap 转换为 WPF Bitmap?

The*_*Man 2 c# wpf windows-10 uwp

我试图让SoftwareBitmapWPF 中的东西可以使用Bitmap. 像这个问题这样的方法看起来很有希望,但它们似乎使用来自不同命名空间的对象,这些对象在我的情况下不太适用。对于上下文,我MediaCapture在我的 WPF 应用程序中使用来自 UWP 的土地进行网络摄像头流式传输。

public static WriteableBitmap WriteableBitmapFromSoftwareBitmap(SoftwareBitmap soft)
{
    WriteableBitmap writeable = new 
    WriteableBitmap(soft.PixelWidth, soft.PixelHeight);
    soft.CopyToBuffer(writeable.PixelBuffer);

    return writeable;
}

public static Bitmap BitmapFromWriteableBitmap(WriteableBitmap writeBmp)
{
    Bitmap bmp;
    using (MemoryStream outStream = new MemoryStream())
    {
        System.Windows.Media.Imaging.BitmapEncoder enc = new 
            BmpBitmapEncoder();

        enc.Frames.Add(BitmapFrame.Create(writeBmp)); // Error here
        enc.Save(outStream);
        bmp = new Bitmap(outStream);
    }

    return bmp;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,在 中BitmapFromWriteableBitmap,对 的调用BitmapFrame.Create抱怨它无法从那种WriteableBitmap.

请注意,WriteableBitmap是 a Windows.UI.Xaml.Media.Imaging.WriteableBitmapSoftwareBitmap是 a Windows.Graphics.Imaging.SoftwareBitmap,而所需的Bitmap是 a System.Drawing.Bitmap

Rob*_*SFT 6

没有直接转换。您需要从 SoftwareBitmap 中提取图像数据,然后从该数据创建新的位图。

这基本上是链接问题所做的:它将 WriteableBitmap 中的数据编码为 .BMP 流,然后从该流加载 System.Drawing.Bitmap。

您可以使用Windows.Graphics.Imaging.BitmapEncoder从 SoftwareBitmap 执行相同操作 。SetSoftwareBitmap将其内容转换为图像流,然后从该流创建一个新的 System.Drawing.Bitmap。

有关示例代码,请参阅使用 BitmapEncoder 将 SoftwareBitmap 保存到文件。您可以渲染到InMemoryRandomAccessStream而不是 StorageFile 的流以避免保存到磁盘,并且可以使用AsStream将其转换为 .Net System.IO.Stream 以读入 System.Drawing.Bitmap 类似于以下(未经测试的)片段:

using (var stream = new Windows.Storage.Streams.InMemoryRandomAccessStream())
{
    BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
    encoder.SetSoftwareBitmap(softwareBitmap);
    await encoder.FlushAsync();
    bmp = new System.Drawing.Bitmap(stream.AsStream());
}
Run Code Online (Sandbox Code Playgroud)