iOS自动对焦拍照

作者: MakeThatChange | 来源:发表于2016-12-31 11:06 被阅读5522次
最新有拍照的需求是这样的 ~
03.gif
  • 手动点击屏幕聚焦,聚焦完成之后就自动拍照

  • 于是开始各种脑补,在别人的基本拍照框架上进行改造 ~

  • 使用了LGPhotoBrowser

  • 使用了MLPhotoBrowser

据说IOS 6开放了相机的自动对焦API,看到这里我就觉得稳了

表情01.gif
//更改设备属性前一定要锁上
-(void)changeDevicePropertySafety:(void (^)(AVCaptureDevice *captureDevice))propertyChange{
    //也可以直接用_videoDevice,但是下面这种更好
    AVCaptureDevice *captureDevice= [_input device];
    //AVCaptureDevice *captureDevice= self.device;
    NSError *error;
    //注意改变设备属性前一定要首先调用lockForConfiguration:调用完之后使用unlockForConfiguration方法解锁,意义是---进行修改期间,先锁定,防止多处同时修改
    BOOL lockAcquired = [captureDevice lockForConfiguration:&error];
    if (!lockAcquired) {
        NSLog(@"锁定设备过程error,错误信息:%@",error.localizedDescription);
    }else{
        [_session beginConfiguration];
        propertyChange(captureDevice);
        [captureDevice unlockForConfiguration];
        [_session commitConfiguration];
    }
}

// 点击屏幕,触发聚焦
- (void)cameraDidSelected:(ZLCameraView *)camera{

    // 当设置完成之后,需要回调到上面那个方法⬆️
    [self changeDevicePropertySafety:^(AVCaptureDevice *captureDevice) {
        
        // 触摸屏幕的坐标点需要转换成0-1,设置聚焦点
        CGPoint cameraPoint= [self.preview captureDevicePointOfInterestForPoint:camera.point];
        
        /*****必须先设定聚焦位置,在设定聚焦方式******/
        //聚焦点的位置
        if ([self.device isFocusPointOfInterestSupported]) {
            [self.device setFocusPointOfInterest:cameraPoint];
        }
        
        // 聚焦模式
        if ([self.device isFocusModeSupported:AVCaptureFocusModeAutoFocus]) {
            [self.device setFocusMode:AVCaptureFocusModeAutoFocus];
        }else{
            NSLog(@"聚焦模式修改失败");
        }

        //曝光点的位置
        if ([self.device isExposurePointOfInterestSupported]) {
            [self.device setExposurePointOfInterest:cameraPoint];
        }
        
        //曝光模式
        if ([self.device isExposureModeSupported:AVCaptureExposureModeAutoExpose]) {
            [self.device setExposureMode:AVCaptureExposureModeAutoExpose];
        }else{
            NSLog(@"曝光模式修改失败");
        }
        
        // 防止点击一次,多次聚焦,会连续拍多张照片
        self.canTakePicture = YES;
        
    }];
    
}

聚焦完成了,那么就是拍照了

于是又是各种问,各种 🔍,发现苹果没有提供对焦成功的事件,但是提供了对焦发生改变的属性那么,是可以监听这个属性 adjustingFocus

表情02.jpg
// 监听焦距发生改变
-(void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context {

    if([keyPath isEqualToString:@"adjustingFocus"]){
        BOOL adjustingFocus =[[change objectForKey:NSKeyValueChangeNewKey] isEqualToNumber:[NSNumber numberWithInt:1]];
        
        NSLog(@"adjustingFocus~~%d  change~~%@", adjustingFocus, change);
        // 0代表焦距不发生改变 1代表焦距改变
        if (adjustingFocus == 0) {
                        
        }

    }
}

// 增加监听
- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    
    AVCaptureDevice *camDevice =[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    int flags =NSKeyValueObservingOptionNew;
    [camDevice addObserver:self forKeyPath:@"adjustingFocus" options:flags context:nil];
}
// 移除监听
- (void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
 
    AVCaptureDevice*camDevice =[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    [camDevice removeObserver:self forKeyPath:@"adjustingFocus"];
}

问题来了,焦距发生改变,不一定最清楚的

表情03.jpg 屏幕快照 2016-12-31 上午10.41.14.png

后来发现adjustingFocus的值为0的时候(聚焦没有改变)

聚焦基本是完成。并且还有时候,聚焦一次(adjustingFocus会有两次打印 1:聚焦发生改变 0:聚焦没有改变),有的时候会聚焦两次(adjustingFocus会有四次打印 1 0 1 0)。这两种方式都是最后的0处有较清楚的图片
于是我增加了延时,让每次拍照,都能保证在最后的adjustingFocus = 0的地方,我测试都可以得到较清楚的照片,现在只能先这样了 ~ 有更好的方式记得@me

表情04.jpg
// 监听焦距发生改变
-(void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context {

    if([keyPath isEqualToString:@"adjustingFocus"]){
        BOOL adjustingFocus =[[change objectForKey:NSKeyValueChangeNewKey] isEqualToNumber:[NSNumber numberWithInt:1]];
        
        NSLog(@"adjustingFocus~~%d  change~~%@", adjustingFocus, change);
        // 0代表焦距不发生改变 1代表焦距改变
        if (adjustingFocus == 0) {
            
            // 判断图片的限制个数
            if ((self.images.count == 1 && self.cameraType == ZLCameraSingle) || !self.GraphRecognition || !self.canTakePicture) {
                return;
            }
            
            // 点击一次可能会聚一次焦,也有可能会聚两次焦。一次聚焦,图像清晰。如果聚两次焦,照片会在第二次没有聚焦完成拍照,应为第一次聚焦完成会触发拍照,而拍照时间在第二次未聚焦完成,图像不清晰。增加延时可以让每次都是聚焦完成的时间点
            dispatch_async(dispatch_get_global_queue(0, 0), ^{
                [NSThread sleepForTimeInterval:0.2];
                dispatch_sync(dispatch_get_main_queue(), ^{
                    // 拍照
                    [self stillImage:nil];
                });
            });
        }

    }
}

最后附上代码 ~ demo下了好久了,来不及找到在哪里下的 ~ 如有知道,@我,我会第一时间注明出处 下载

相关文章

  • iOS自动对焦拍照

    最新有拍照的需求是这样的 ~ 手动点击屏幕聚焦,聚焦完成之后就自动拍照 于是开始各种脑补,在别人的基本拍照框架上进...

  • 入门单反

    1. 对焦 AF:自动对焦,半按快门,对焦完成会有提示音,按下快门完成拍照;MF:手动对焦 对焦模式(3种):按住...

  • iOS 自定义相机拍照,手动对焦和自动对焦

    天下虚怀接空谷,何处高峰不入云。 一、相机界面绘制需要的一些宏 二、属性的申明 三、正文开始 自定义相机代码 改变...

  • 对焦模式

    AF自动对焦,MF手动对焦。 MF手动对焦转动对焦环,变清晰,任何情况下都可以对焦。 Af自动对焦可以快速对焦,分...

  • iOS 自定义相机自动对焦拍照求助

    最近在做一个自定义相机的Demo, Demo的需求是相机对着某一处,当自动对焦成功后,然后拍摄图片。 自动对焦的功...

  • iOS拍照后图片翻转

    iOS拍照后图片翻转 iOS拍照后图片自动翻转,是Image有一个imageOrientation属性,里面有图片...

  • iOS拍照后图片翻转

    iOS拍照后图片翻转 iOS拍照后图片自动翻转,是Image有一个imageOrientation属性,里面有图片...

  • 数码单反摄影轻松入门(2.7)

    巧设AF自动对焦和对焦模式 数码单方相机通常具备多个自动对焦点,可以对位于画面中心和四周的景物进行自动对焦,但正是...

  • 摄像头成像3A算法及控制技术

    3A技术即自动对焦(AF)、自动曝光(AE)和自动白平衡(AWB)。3A数字成像技术利用了AF自动对焦算法、AE自...

  • 对焦

    对焦概念 对焦是指使用照相机时调整好焦点距离,英文学名为Focus,一般有两种对焦方式,自动对焦、手动对焦。 对焦...

网友评论

    本文标题:iOS自动对焦拍照

    本文链接:https://www.haomeiwen.com/subject/fpgyvttx.html