0

我想在AVFoundation實施「捏到變焦」功能與AVCaptureDeviceAVCaptureDevice videoZoomFactor捏到縮放比例

@IBAction func pinchGestureDetected(_ gestureRecognizer: UIPinchGestureRecognizer) { 

    switch gestureRecognizer.state { 
    case .began: 
     print ("began") 
     self.currenZoomFactor = self.videoDevice!.videoZoomFactor 
     do { 
      try self.videoDevice!.lockForConfiguration() 
     } catch let error as NSError { 
      NSLog("Could not lock device for configuration: %@", error) 
     } 

    case .changed: 
     print ("changed") 

      var zoomValue : CGFloat = ((gestureRecognizer.scale) - 1) + self.currenZoomFactor 
      if zoomValue > min(10.00, self.videoDevice!.activeFormat.videoMaxZoomFactor) { 
       zoomValue = min(10.00, self.videoDevice!.activeFormat.videoMaxZoomFactor) 

      } else if zoomValue < 1.00 { 
       zoomValue = 1.00 
      } 

      self.videoDevice!.videoZoomFactor = sentZoomValue 

    case .ended, .cancelled: 
     print ("ended/canceld") 
     self.videoDevice!.unlockForConfiguration() 

    default: 
     break 
    } 

} 

以上工作正常。但是,以上,縮放率是線性的與縮放比例。這使得在更高的變焦倍數下變焦慢得多。

如何在更高的縮放係數下獲得加速縮放比率?

回答

2

要獲得加速放大率,我們需要一些以下計算。

您可以調用此實用程序方法您pinchGestureDetected

func zoomto(scale: CGFloat, hasBegunToZoom: Bool) { 

    if hasBegunToZoom { 
     initialPinchZoom = captureDevice.videoZoomFactor 
    } 
    do { 
     try captureDevice.lockForConfiguration() 
     if scale < 1.0 { 
      zoomFactor = initialPinchZoom - pow(captureDevice.activeFormat.videoMaxZoomFactor, 1.0 - scale) 
     } 
     else { 
      zoomFactor = initialPinchZoom + pow(captureDevice.activeFormat.videoMaxZoomFactor, (scale - 1.0f)/2.0f) 
     } 
     zoomFactor = min(10.0, zoomFactor) 
     zoomFactor = max(1.0, zoomFactor) 
     captureDevice.videoZoomFactor = zoomFactor 
     captureDevice.unlockForConfiguration() 
    } catch let error as NSError { 
     NSLog("Could not lock device for configuration: %@", error) 
    } 
} 

可以調用像下面

@IBAction func pinchGestureDetected(_ gestureRecognizer: UIPinchGestureRecognizer) { 
    zoomto(scale: gestureRecognizer.scale, hasBegunToZoom:(gestureRecognizer.state == .began)) 
}