【问题标题】:How to implement "pinch to zoom" in custom camera如何在自定义相机中实现“捏放大”
【发布时间】:2016-02-06 20:42:00
【问题描述】:

我有一个自定义的照片/摄像机(想想 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 _{
                    }
                }

            }
        }

【问题讨论】:

    标签: ios swift


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      当你缩小 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预览层来实现pinch zoom。

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

      当调用视频捕获方法时,将预览层转换为身份。所以它会重置缩放。

       yourPreviewLayer.affineTransForm = CGAffineTransformIdentity
      

      【讨论】:

        猜你喜欢
        • 2016-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多