iOS AV Foundation 二维码扫描 05 缩放摄像头

最后一节,我们为程序添加通过手势对摄像头进行缩放控制的功能。

添加实例变量,并在viewDidLoad方法的最后,进行初始化:

    CGFloat _initialPinchZoom;
    [_previewView addGestureRecognizer:[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchDetected:)]];
实现pinchDetected:方法:

- (void)pinchDetected:(UIPinchGestureRecognizer*)recogniser
{
    // 1
    if (!_videoDevice)
        return;
    
    // 2
    if (recogniser.state == UIGestureRecognizerStateBegan)
    {
        _initialPinchZoom = _videoDevice.videoZoomFactor;
    }
    
    // 3
    NSError *error = nil;
    [_videoDevice lockForConfiguration:&error];
    
    if (!error) {
        CGFloat zoomFactor;
        CGFloat scale = recogniser.scale;
        if (scale < 1.0f) {
            // 4
            zoomFactor = _initialPinchZoom - pow(_videoDevice.activeFormat.videoMaxZoomFactor, 1.0f - recogniser.scale);
        }
        else
        {
            // 5
            zoomFactor = _initialPinchZoom + pow(_videoDevice.activeFormat.videoMaxZoomFactor, (recogniser.scale - 1.0f) / 2.0f);
        }
        
        // 6
        zoomFactor = MIN(10.0f, zoomFactor);
        zoomFactor = MAX(1.0f, zoomFactor);
            
        // 7
        _videoDevice.videoZoomFactor = zoomFactor;
            
        // 8
        [_videoDevice unlockForConfiguration];
    }
}

  1. 检查是否有可用的视频设备。
  2. 在手势识别开始时,记录初始缩放因子。
  3. 在开始修改视频设备参数前,锁定视频设备。
  4. 如果锁定成功,计算手势行为,scale小于1.0表示用户两指间距离在缩小,程序需要放大摄像头。
  5. scale大于1.0表示用户两指间距离在变大,程序需要缩小摄像头。第4步和第5步中的计算公式是为了让缩放看起来更自然。
  6. 限制缩放的最大最小值。
  7. 为视频设备设置缩放因子。
  8. 最后,解锁视频设备。

编译执行,在手机上缩放效果如下:

技术分享

技术分享

转载请注明出处:

http://blog.csdn.net/yamingwu/article/details/44535787



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。