본문 바로가기
ios 뽀개기/objective-c

카메라 줌 AVCaptureDevice Zoom

by 인생여희 2019. 4. 2.
반응형

카메라 줌 AVCaptureDevice Zoom

예전시간에 카메라 자동 회전 기능을 소개했다.

https://abc1211.tistory.com/615

그곳에 카메라 줌기능을 넣기 위해서 이것저것 찾아보고 시도해보았다.

처음에는 카메라 캡쳐화면을 실시간으로 보여주는 PreviewLayer에 pinchegesture를 걸어서

제스쳐 변화 값을 이용해서 zoom해주면 된다고 생각했는데 거의 오전 내내 삽질을 했다.

결론은 previewlayer에는 gesture 를 걸 수 없다. Avcapturedevice 를 이용해야 한다.

아래는 해당 소스이다. 주석을 달아 놓았다.

*제스쳐 함수

//self.view 에 pinches 제스쳐 이벤트를 걸었다. view 화면을 두 손가락으로 움직이면 AVCaptureDevice의 줌을 변경한다.
-(void) handlePinchToZoomRecognizer2:(UIPinchGestureRecognizer*) pinchRecognizer {
    
    static CGFloat zoomFactorBegin = 0.0;                                                                                                   //시작 줌 값
    
    //제스쳐를 처음 시작했을때
    if ( UIGestureRecognizerStateBegan == pinchRecognizer.state ) {
        zoomFactorBegin = self.inputDevice.videoZoomFactor;                                                                      //     1.0
         NSLog(@"제스쳐 시작- 줌 값 : %f" , zoomFactorBegin);                                                                          //     1.0
         NSLog(@"제스쳐 시작 맥스- 줌 값 : %f" , self.inputDevice.activeFormat.videoMaxZoomFactor);         //     16.0
        
    //제스쳐  변화중 상태 값
    } else if (UIGestureRecognizerStateChanged == pinchRecognizer.state) {
        NSError *error = nil;
        
        //*lockForConfiguration
        //*설명: 아이폰의 하드웨어 속성을 변경하기 전에 이 메서드를 호출해야 한다.
        // 이 메서드를 호출 한 후 잠금을 해제 하고, 설정을 변경 후 잠금을 해준다.
        if ([self.inputDevice lockForConfiguration:&error]) {
            
            NSLog(@"제스쳐 변화- zoomFactorBegin줌 값 1 : %f" , zoomFactorBegin);                                          //1.0
            NSLog(@"제스쳐 pinchRecognizer.scale-  값  : %f" , pinchRecognizer.scale);                                     //1.02334~ 1.43343
            
            CGFloat desiredZoomFactor = zoomFactorBegin * pinchRecognizer.scale;
            
            NSLog(@"제스쳐 desiredZoomFactor- 줌 값  : %f" , desiredZoomFactor);                                             //1.02334~ 1.43343
            NSLog(@"제스쳐 변화 맥스- 줌 값 : %f" , self.inputDevice.activeFormat.videoMaxZoomFactor);           //16
            
            //*activeFormat : 활성화된 캡쳐 장치의 미디어 데이터 형식. 이 속성을 사용하여 현재 활성된 장치의 형식을 가져오거나 설정한다.
            //*videoMaxZoomFactor :  최대 zoom 값을 가져왔다.
            
            
            //zoomFactor의 최소 값이 1.0 이상이도록 설정.
            CGFloat zoomFactor = MAX(1.0, MIN(desiredZoomFactor, self.inputDevice.activeFormat.videoMaxZoomFactor));
            
             NSLog(@"제스쳐 zoomFactor- 줌 값  : %f" , zoomFactor);                                                                   //1.02334~ 1.43343
            
            //현재 확대,축소 비율에서 변경된 확대,축소 비율로 부드럽게 전환해주는 메소드
            [self.inputDevice rampToVideoZoomFactor:zoomFactor withRate:3.0];
            
            //하드웨어 속성을 잠궈준다.
            [self.inputDevice unlockForConfiguration];
        } else {
            NSLog(@"error: %@", error);
        }
    }
}

 

*viewdidload 함수 안

    //카메라 줌 제스쳐
    UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchToZoomRecognizer2:)];
    [self.view addGestureRecognizer:pinchGesture];

 

*파일

zoom.zip
0.08MB

반응형

댓글