将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远程设备上调试此。

将SoftwareBitmap转换为WriteableBitmap

我可以通过使用您的代码来重现这个问题。它是由帧引起的。软件位图总是返回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");
    }