怎么把UWP SoftwareBitmap转换成WPF Bitmap?

时间:2018-06-28 14:08:57

标签: c# wpf uwp windows-10

我正在尝试使SoftwareBitmap可以在WPF中用作Bitmap。 像this question shows这样的方法看起来很有希望,但是它们似乎使用了来自不同命名空间的对象,这些对象在我的情况下不太起作用。就上下文而言,我将UWP土地上的MediaCapture用于我的WPF应用中的网络摄像头流。

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

不幸的是,在BitmapFromWriteableBitmap中,对BitmapFrame.Create的调用抱怨它无法从这种WriteableBitmap创建URI。

请注意,WriteableBitmapWindows.UI.Xaml.Media.Imaging.WriteableBitmapSoftwareBitmapWindows.Graphics.Imaging.SoftwareBitmap, 而所需的BitmapSystem.Drawing.Bitmap

1 个答案:

答案 0 :(得分:3)

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

这实际上是linked question的作用:它将WriteableBitmap中的数据编码为.BMP流,然后从该流中加载System.Drawing.Bitmap。

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

有关示例代码,请参见Save a SoftwareBitmap to a file with BitmapEncoder。您可以呈现为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);
}