我正在尝试从网络摄像头裁剪图像并显示在摄像头预览旁边。
裁剪图像时应考虑三个方面。
我发现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;
答案 0 :(得分:1)
但是我仍然不知道如何显示VideoFrame(不保存图像),设置裁剪位置。
如果要在xaml上显示框架,则需要将框架转换为可显示的格式并将其渲染到屏幕上。请检查官方相机框架示例中的FrameRender类。它有一个ConvertToDisplayableImage
方法,应该是您想要的。
然后,您可以在“图像”控件中显示它。之后,您可以使用Image.Clip设置要裁剪的位置。