Я пытаюсь обрезать изображение с веб-камеры и отображать прямо рядом с предварительным просмотром камеры.
Обрезка изображения должна выполняться с 3 соображениями.
- Вывод обрезанного изображения должен быть в виде VideoFrame
- Необходимо отобразить вышеприведенный вывод VideoFrame (на xaml)
- Целевое изображение кадрирования находится в середине исходного изображения
Я обнаружил, что 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;