AVCaptureVideoPreviewLayer 在 iOS 中添加叠加层和捕获照片

AVCaptureVideoPreviewLayer add overlays and capture photo in iOS

最初的想法是通过 AVCaptureSession 启动相机流,在原始 CMSampleBuffer 中找到人脸,然后在 AVCaptureVideoPreviewLayer 上添加一些图像作为图层,然后截取屏幕截图。

完成之后,后来发现UIGraphicsGetImageFromCurrentImageContext不能和AVCaptureVideoPreviewLayer一起使用,所以截图不能解决我的问题。

所以我使用 MetalMTKView 来执行一些实时渲染,结合使用 CoreImage Filters 和 Metal,结果很好。我已经知道如何使用内置的 CoreImage 滤镜检测人脸并改变那部分人脸,但我找不到合适的方法将图像添加到另一个图像上。

如何根据背景图像中的定位混合两个图像?我有 CIImage 可以使用。

您可以将叠加层加载到 CIImage,然后使用 transformed(by matrix: CGAffineTransform) 将其移动到面部位置,最后使用 composited(over dest: CIImage) 将其混合到 CIImage 来自视频缓冲区。 您可能需要做一些工作才能在不同的坐标空间之间进行转移。

还有许多更复杂的合成滤镜可用。查看 CICategoryCompositeOperation 类别中的 filters