如何在自定义相机中实现“捏合缩放”功能

3
我有一个自定义的照片/视频相机(类比 Snapchat),其中包含捏合手势识别器来进行放大/缩小操作。以下是网上找到的代码所能正常运行的部分:
  • 可以适当地进行放大
  • 捕捉图像可以捕捉到已经放大的图像
以下是我需要帮助解决的问题:
  • 缩小导致崩溃
  • 尽管放大功能有效,但如果我先放大再停止触摸屏幕,然后再次尝试放大时,它似乎会重置放大状态。
  • 捕捉视频会重置放大状态
这是我的捏合手势代码,请问需要做哪些更改?
for input in self.captureSession.inputs {
            // check that the input is a camera and not the audio
            if input.device == self.frontCameraDevice || input.device == self.backCameraDevice {

                if pinch.state == UIGestureRecognizerState.Changed {

                    let device: AVCaptureDevice = input.device
                    let vZoomFactor = pinch.scale
                    do{
                        try device.lockForConfiguration()
                        if vZoomFactor <= device.activeFormat.videoMaxZoomFactor {
                            device.videoZoomFactor = vZoomFactor
                            device.unlockForConfiguration()
                        }
                    }catch _{
                    }
                }

            }
        }
2个回答

3

您需要根据先前的值设置videoZoomFactor。

do {
    try device.lockForConfiguration()
    switch gesture.state {
    case .began:
        self.pivotPinchScale = device.videoZoomFactor
    case .changed:
        var factor = self.pivotPinchScale * gesture.scale
        factor = max(1, min(factor, device.activeFormat.videoMaxZoomFactor))
        device.videoZoomFactor = factor
    default:
        break
    }
    device.unlockForConfiguration()
} catch {
    // handle exception
}

您应该保存先前的比例因子,以便从当前缩放状态开始进行缩放。上面示例中的self.pivotPinchScale是关键。我希望您能从以下示例中获取一些提示。

https://github.com/DragonCherry/CameraPreviewController


0
当你缩小视图时,pinch.scale的值会小于1.0,然后应用程序会崩溃。 方法-1
 //just change this line
 if pinch.scale > 1.0 {
  device.videoZoomFactor = vZoomFactor
 } else {
  device.videoZoomFactor = 1.0 + vZoomFactor
}

方法 - 2

您可以通过转换AVCaptureSession预览层来实现捏合缩放。

 yourPreviewLayer.affineTransForm = CGAffineTransformMakeScale(1.0 + pinch.scale.x, 1.0 +pinch.scale.y)

当视频捕获方法调用时,将预览层变换更改为标识。这样它就会重置缩放。
 yourPreviewLayer.affineTransForm = CGAffineTransformIdentity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接