Convert SoftwareBitmap to WriteableBitmap

Every time I want to convert SoftwareBitmap to WriteableBitmap , I get the following exception: System.Runtime.InteropServices.COMException .

Here is my code snippet for this:

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

Line

 frameBitmap.CopyToBuffer(bitmap.PixelBuffer); 

throws an exception.

I am debugging this on x64 RemoteDevice.

+5
source share
1 answer

I can reproduce this problem using your code. This is called frame.SoftwareBitmap always returns null.

You can fix this problem using the following code:

  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"); } 
+6
source

Source: https://habr.com/ru/post/1234677/


All Articles