我正在尝试使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。
请注意,WriteableBitmap
是Windows.UI.Xaml.Media.Imaging.WriteableBitmap
,
SoftwareBitmap
是Windows.Graphics.Imaging.SoftwareBitmap
,
而所需的Bitmap
是System.Drawing.Bitmap
。
答案 0 :(得分:3)
没有直接转换。您需要从SoftwareBitmap中提取图像数据,然后根据该数据创建新的Bitmap。
这实际上是linked question的作用:它将WriteableBitmap中的数据编码为.BMP流,然后从该流中加载System.Drawing.Bitmap。
您可以通过使用Windows.Graphics.Imaging.BitmapEncoder。SetSoftwareBitmap从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);
}