c # UWP отображает видеокадр и положение RenderTargetBitmap - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь обрезать изображение с веб-камеры и отображать прямо рядом с предварительным просмотром камеры.

Обрезка изображения должна выполняться с 3 соображениями.

  1. Вывод обрезанного изображения должен быть в виде VideoFrame
  2. Необходимо отобразить вышеприведенный вывод VideoFrame (на xaml)
  3. Целевое изображение кадрирования находится в середине исходного изображения

Я обнаружил, что RenderTargetBitmap поможет мне получить обрезанное изображение.

Но, тем не менее, я не знаю, как отобразить видеокадр (без сохранения изображения), установить положение обрезки.

Я застрял в коде ниже

    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 голосов
/ 29 октября 2018

Но все же я понятия не имею, как отобразить видеокадр (без сохранения изображения), установить положение обрезки.

Если вы хотите показать рамку на xaml, вам необходимо преобразовать рамку в отображаемый формат и отобразить ее на экране. Пожалуйста, проверьте класс FrameRender в официальном образце Рамки камеры . У него есть метод ConvertToDisplayableImage, который должен быть тем, что вы хотите.

Затем вы можете показать это в управлении изображениями. После этого вы можете использовать Image.Clip , чтобы установить позицию, в которой вы хотите обрезать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...