将SoftwareBitmap转换为WriteableBitmap
本文关键字:WriteableBitmap 转换 SoftwareBitmap | 更新日期: 2023-09-27 18:19:31
每次当我想将SoftwareBitmap
转换为WriteableBitmap
时,我都会得到以下异常:System.Runtime.InteropServices.COMException
。
这是我的代码片段:
private async void Start(object sender, RoutedEventArgs e)
{
_MediaCapture = new MediaCapture();
await _MediaCapture.InitializeAsync();
mediaElement.Source = _MediaCapture;
await _MediaCapture.StartPreviewAsync();
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = new TimeSpan(0, 0, 0, 1);
timer.Tick += HandleTimerTick;
timer.Start();
}
private async void HandleTimerTick(object Sender, object E)
{
var frame = await _MediaCapture.GetPreviewFrameAsync();
SoftwareBitmap frameBitmap = frame.SoftwareBitmap;
WriteableBitmap bitmap = new WriteableBitmap(frameBitmap.PixelWidth, frameBitmap.PixelHeight);
try
{
frameBitmap.CopyToBuffer(bitmap.PixelBuffer);
}
catch (Exception)
{
Debug.WriteLine("Exception ");
}
}
线路
frameBitmap.CopyToBuffer(bitmap.PixelBuffer);
正在引发异常。
我正在x64远程设备上调试此。
我可以通过使用您的代码来重现这个问题。它是由帧引起的。软件位图总是返回null。
您可以使用以下代码来解决此问题:
private async void button_Click(object sender, RoutedEventArgs e)
{
_mediaCapture = new MediaCapture();
await _mediaCapture.InitializeAsync();
mediaElement.Source = _mediaCapture;
await _mediaCapture.StartPreviewAsync();
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = new TimeSpan(0, 0, 0, 1);
timer.Tick += Timer_Tick;
timer.Start();
}
private async void Timer_Tick(object sender, object e)
{
var previewProperties = _mediaCapture.VideoDeviceController.GetMediaStreamProperties(MediaStreamType.VideoPreview) as VideoEncodingProperties;
var videoFrame = new VideoFrame(BitmapPixelFormat.Bgra8, (int)previewProperties.Width, (int)previewProperties.Height);
var frame = await _mediaCapture.GetPreviewFrameAsync(videoFrame);
SoftwareBitmap frameBitmap = frame.SoftwareBitmap;
WriteableBitmap bitmap = new WriteableBitmap(frameBitmap.PixelWidth, frameBitmap.PixelHeight);
frameBitmap.CopyToBuffer(bitmap.PixelBuffer);
Debug.WriteLine("done");
}