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

Posted

技术标签:

【中文标题】如何在自定义相机中实现“捏放大”【英文标题】: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 _
                    
                

            
        

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何在自定义相机中实现“捏放大”的主要内容,如果未能解决你的问题,请参考以下文章

Android将相机图像保存在自定义文件夹中

如何在自定义 Spring 存储库中实现自定义方法? [复制]

如何在自定义 delphi 组件中实现 stringlist 属性?

如何在自定义 UIButton 中实现 .isHighlighted 动画?

如何使用edittexts在自定义ListView中实现监听器文本更改?

在自定义指令 angular 4 中实现 onclick()