c#UWP显示视频帧和RenderTargetBitmap位置

时间:2018-10-26 07:23:29

标签: c# uwp

我正在尝试从网络摄像头裁剪图像并显示在摄像头预览旁边。

裁剪图像时应考虑三个方面。

  1. 裁剪后的图像的输出应采用VideoFrame的形式
  2. 上面的输出VideoFrame需要显示(在xaml上)
  3. 目标作物图像位于原始图像的中间

我发现RenderTargetBitmap可以帮助我获取裁剪的图像。

但是我仍然不知道如何显示VideoFrame(不保存图像),设置裁剪位置。

我陷入了下面的代码

    public async Task<VideoFrame> CroppingImage(Grid grid)
    {
        RenderTargetBitmap renderBitmap = new RenderTargetBitmap();

        await renderBitmap.RenderAsync(grid);
        var buffer = await renderBitmap.GetPixelsAsync();
        var softwareBitmap = SoftwareBitmap.CreateCopyFromBuffer(buffer, BitmapPixelFormat.Bgra8, renderBitmap.PixelWidth, renderBitmap.PixelHeight, BitmapAlphaMode.Ignore);

        buffer = null;
        renderBitmap = null;

        VideoFrame vf = VideoFrame.CreateWithSoftwareBitmap(softwareBitmap);
        await CropAndDisplayInputImageAsync(vf);

        return cropped_vf;
    }


    private async Task CropAndDisplayInputImageAsync(VideoFrame inputVideoFrame)
    {
        //some cropping algorithm here
        //i have a rectangle on a canvas(camera preview is on CaptureElement)
        //I know the left top position and width and height but no idea how to use
    }

有帮助吗?

这就是我发现并完成的事情:)

(假设有一个视频框的名字是croppedface)

        croppedFace = new VideoFrame(BitmapPixelFormat.Bgra8, (int)width, (int)height, BitmapAlphaMode.Ignore);

        await inputVideoFrame.CopyToAsync(croppedFace, cropBounds, null);

        SoftwareBitmap asdf = croppedFace.SoftwareBitmap;
        asdf = SoftwareBitmap.Convert(asdf, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore);
        var qwer = new SoftwareBitmapSource();
        await qwer.SetBitmapAsync(asdf);
        CroppedFaceImage.Source = qwer;

1 个答案:

答案 0 :(得分:1)

  

但是我仍然不知道如何显示VideoFrame(不保存图像),设置裁剪位置。

如果要在xaml上显示框架,则需要将框架转换为可显示的格式并将其渲染到屏幕上。请检查官方相机框架示例中的FrameRender类。它有一个ConvertToDisplayableImage方法,应该是您想要的。

然后,您可以在“图像”控件中显示它。之后,您可以使用Image.Clip设置要裁剪的位置。