Я пытаюсь обрезать изображение с веб-камеры и отображать его рядом с превью камеры.
При кадрировании изображения следует учитывать 3 соображения.
VideoFrame
.VideoFrame
, необходимо отобразить (в XAML).Я обнаружил, что 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;
But still I have no idea how to display VideoFrame(without saving an image), set the position where to crop.
Если вы хотите показать фрейм в xaml, вам необходимо преобразовать фрейм в отображаемый формат и отобразить его на экране. Пожалуйста, проверьте класс FrameRender в официальном Образец кадров камеры. У него есть метод ConvertToDisplayableImage
, который должен быть тем, что вам нужно.
Затем вы можете показать его в элементе управления изображением. После этого вы можете использовать Image.Clip, чтобы установить позицию, в которой вы хотите обрезать.