如何设置面对面的相机变焦与快速的基础

时间:2016-04-14 12:11:11

标签: ios swift camera avfoundation ios-camera

我试图用swift制作应用程序,我想使用前置摄像头。 我使用AVFoundation并尝试了一些代码。但我无法设置前置缩放参数。可能吗?对于后置摄像头,一切都运作成功。

我不想使用仿射变换。因为,它可以降低图像质量。那么,如何以编程方式设置此参数?

感谢。

2 个答案:

答案 0 :(得分:1)

您需要将zoomFactor变量添加到相机中。

  var zoomFactor: CGFloat = 1.0

接下来定义一个与捏合识别器一起使用的函数 zoom 。我假设你已经创建了一个前捕获设备和输入。 frontDevice 是我相机上的可选捕捉设备。这是我如何缩放该设备。

  public func zoom(pinch: UIPinchGestureRecognizer) {
    guard let device = frontDevice else { return }
    func minMaxZoom(_ factor: CGFloat) -> CGFloat { return min(max(factor, 1.0), device.activeFormat.videoMaxZoomFactor) }

    func update(scale factor: CGFloat) {
      do {
        try device.lockForConfiguration()
        defer { device.unlockForConfiguration() }
        device.videoZoomFactor = factor
      } catch {
        debugPrint(error)
      }
    }

    let newScaleFactor = minMaxZoom(pinch.scale * zoomFactor)

    switch pinch.state {
      case .began: fallthrough
      case .changed: update(scale: newScaleFactor)
      case .ended:
        zoomFactor = minMaxZoom(newScaleFactor)
        update(scale: zoomFactor)
      default: break
    }
  }

最后在某些视图中添加一个捏合识别器。

  let pgr = UIPinchGestureRecognizer(target: self, action: #selector(zoom))
  view.addGestureRecognizer(pgr)

答案 1 :(得分:1)

无需内部方法即可完成先前的答案,从而使其更加直接和易于理解。

要完整解释代码,请执行以下操作:

zoom变量可跟踪您在上一个手势之后的缩放比例。在发生任何手势之前,没有缩放,因此您的位置为1.0。

在手势过程中,scale的{​​{1}}属性可保持活动手势期间的收缩比例。当手指没有从其初始位置移开并随捏而增长和收缩时,此值为1.0。通过将此乘以先前持有的pinch,您可以得出手势发生时的当前缩放比例。重要的是,将此比例保持在zoom的范围内,否则您将获得[1, device.activeFormat.videoMaxZoomFactor]

手势(SIGABRT)完成后,您需要更新pinch.state,以便下一个手势从当前缩放级别开始。

在修改相机属性时,请务必进行锁定,以避免同时进行修改。无论如何,zoom都会在代码块后释放锁定,类似于defer块。

finally