每当我想将我的SoftwareBitmap
转换为一个WriteableBitmap
我得到以下exception: 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);
抛出exception。
我正在x64 RemoteDevice上debugging这个。
我可以通过使用您的代码重现此问题。 这是由frame.SoftwareBitmap总是返回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"); }