首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AVCaptureDevice相机缩放

AVCaptureDevice相机缩放
EN

Stack Overflow用户
提问于 2012-04-19 10:42:55
回答 9查看 26.1K关注 0票数 20

我运行了一个简单的AVCaptureSession来获取我的应用程序中的摄像头并拍照。如何使用相机的UIGestureRecognizer实现“收缩缩放”功能?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2015-07-04 05:37:41

公认的答案实际上是过时的,我不确定它是否真的会拍摄放大图像的照片。答案说,有一种方法可以像There一样放大图像。他回答的问题是,它不负责用户可以放大然后从该缩放位置重新启动的事实。他的解决方案将创建某种不是真正优雅的跳跃。

最简单、最优雅的方法是使用收紧手势的速度。

代码语言:javascript
复制
-(void) handlePinchToZoomRecognizer:(UIPinchGestureRecognizer*)pinchRecognizer {
    const CGFloat pinchVelocityDividerFactor = 5.0f;

    if (pinchRecognizer.state == UIGestureRecognizerStateChanged) {
        NSError *error = nil;
        if ([videoDevice lockForConfiguration:&error]) {
            CGFloat desiredZoomFactor = device.videoZoomFactor + atan2f(pinchRecognizer.velocity, pinchVelocityDividerFactor);
            // Check if desiredZoomFactor fits required range from 1.0 to activeFormat.videoMaxZoomFactor
            device.videoZoomFactor = MAX(1.0, MIN(desiredZoomFactor, device.activeFormat.videoMaxZoomFactor));
            [videoDevice unlockForConfiguration];
        } else {
            NSLog(@"error: %@", error);
        }
    }
}

我发现,将arctan函数添加到速度中会使放大和缩小效果变得稍微轻松一些。它不是完全完美的,但效果足以满足需要。当它几乎达到1时,可能会有另一个函数来简化缩小。

NOTE:另外,一个收缩手势的比例从0到无限大,0到1是放大(缩小),1到无限大是缩小(放大)。要获得良好的放大和缩小效果,你需要有一个数学方程。速度实际上是从-infinite到无穷大,0是起始点。

编辑:修复了范围异常时的崩溃。感谢@garafajon

票数 45
EN

Stack Overflow用户

发布于 2012-04-19 11:04:26

许多人试图通过将层上的transform属性设置为CGAffineTransformMakeScale(gesture.scale.x, gesture.scale.y);来做到这一点,请参阅here以获得完整的收缩到缩放的实现。

票数 6
EN

Stack Overflow用户

发布于 2015-04-08 05:39:02

从iOS 7开始,您可以使用AVCaptureDevicevideoZoomFactor属性直接设置缩放。

使用缩放常数将UIPinchGestureRecognizerscale属性绑定到videoZoomFactor。这可以让你改变对口味的敏感度:

代码语言:javascript
复制
-(void) handlePinchToZoomRecognizer:(UIPinchGestureRecognizer*)pinchRecognizer {
    const CGFloat pinchZoomScaleFactor = 2.0;

    if (pinchRecognizer.state == UIGestureRecognizerStateChanged) {
        NSError *error = nil;
        if ([videoDevice lockForConfiguration:&error]) {
            videoDevice.videoZoomFactor = 1.0 + pinchRecognizer.scale * pinchZoomScaleFactor;
            [videoDevice unlockForConfiguration];
        } else {
            NSLog(@"error: %@", error);
        }
    }
}

请注意,AVCaptureDevice和其他所有与AVCaptureSession相关的东西都不是线程安全的。因此,您可能不希望在主队列中执行此操作。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10220958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档