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

我有一个自定义照片/摄像机(想想Snapchat),带有一个捏合识别器来放大/缩小。 基于我在网上找到的一些代码,这是正确的:

  • 放大一些工作正常
  • 捕获图像会捕获缩放的图像

这是我需要帮助的问题:

  • 缩小导致崩溃
  • 虽然放大工作,但如果我放大,似乎重置缩放,停止触摸屏幕,然后尝试再次放大。
  • 捕获video会重置缩放

这是我的捏手势代码,应该改变什么?

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 _{ } } } } 

您必须根据以前的值设置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

当你缩小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) 

当video捕获方法调用将预览层转换为标识时。 所以它会重置缩放。

  yourPreviewLayer.affineTransForm = CGAffineTransformIdentity