원문 : http://jamesonquave.com/blog/taking-control-of-the-iphone-camera-in-ios-8-with-swift-part-2/


Taking control of the iPhone camera in iOS 8 with Swift (Part 2)


AVFoundation API 사용하여, 우리는 캡쳐 세션을 설정하고 앱을 만들것이다. 수동으로 초점, 노출, ISO 제어하는 것을 포함한다. 우선 우리는 기본적으로 카메라 미리보기를 설정해야 한다. Part 1 에서 우리는 터치 기반의 방법으로 수동으로 초점을 조절을 만들었다. 만약 아직 읽지 않았다면 여기서 읽을수 있다. 


튜토리얼의 이부분에서, API 안을 약간 깊이 볼것이고, 수직 터치 위치를 이용하여 우리의 이미지를 제어 하기 위한 두번째 축을 생성한다.


우선, 화면을 터치 하여 얼마나 멀리 떨어져 있는지 결정하는 코드를 정리한다.  UITouch 객체를 받는 함수를 만들어 보고, 화면 전체 넓이의 퍼센트로 우리가 탭하여 화면에 얼마나 멀리 떨어져 있는지를 지정하는 CGPoint를 반환한다. 예를 들어 화면의 상단-오른쪽을 탭하면 (1,1) CGPoint 값을 반환할것이다. 하단-왼쪽을 탭하면 (0,0)을, 화면의 중심(0.5,0.5) 사이의 모든 값 반환 할것이다. 

func touchPercent(touch : UITouch) -> CGPoint {
    // Get the dimensions of the screen in points
    let screenSize = UIScreen.mainScreen().bounds.size
     
    // Create an empty CGPoint object set to 0, 0
    var touchPer = CGPointZero
     
    // Set the x and y values to be the value of the tapped position, divided by the width/height of the screen
    touchPer.x = touch.locationInView(self.view).x / screenSize.width
    touchPer.y = touch.locationInView(self.view).y / screenSize.height
     
    // Return the populated CGPoint
    return touchPer
}

이 메소드는 touchPercent로 선언하며, touch 인수로 UITouch 객체라는 이름을 가지고 CGPoint를 반환한다. 실제 계산은 간단하다... 터치를 가지고 화면의 넓이 또는 높이 둘중 하나에 대한 점의 전체 갯수로 나눈다. 우리는 이미 초점에 대해서 x 값을 사용했다. 그러나 우리의 새로운 기능을 사용하려면  touchesBegan과 touchesMoved 메소드를 조절해야 한다. 

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    let touchPer = touchPercent( touches.anyObject() as UITouch )
    focusTo(Float(touchPer.x))
}
 
override func touchesMoved(touches: NSSet, withEvent event: UIEvent) {
    let touchPer = touchPercent( touches.anyObject() as UITouch )
    focusTo(Float(touchPer.x))
}

참고 : 우리가 전에 선언된 오래된 screenWidth 변수를 제거 할수 있다.


다음으로, 우리는 ISO를 지정하길 원한다. 만약 여러분이 익숙하지 않다면, ISO는 쉽게 말하면 디지털 카메라에 대해 렌즈에서 빛의 양을 설정하는 것이라고 할 수 있다. 낮은 ISO는 맑고 높은 품질의 이미지를 줄것이지만 셔터 속도가 느리며 흐릿한 사진 효과이다. 매우 낮은 ISO는 삼각대에서 유용한 카메라 모드이다. 매우 높은 ISO는 매우 빠른 촬영과 매우 느린 셔터 속도를 가질수 있다. 하지만 낮은 품질의 이미지와 많은 노이즈가 예상된다. 전문 사진작가를 의미하지 않는다. 그래서 아마 모든 것을 설명하지 않는다. 하지만 내 수준의 이해에 대한것이다.


좋다, 넘어가자... 그냥 앱에 추가할수 있고 우리 자신을 위해 보기 바란다. 


우선, focusValue에 추가한 isoValue를 가지는 focusTo()메소드를 업데이트하자.

func updateDeviceSettings(focusValue : Float, isoValue : Float) {
    if let device = captureDevice {
        if(device.lockForConfiguration(nil)) {
            device.setFocusModeLockedWithLensPosition(focusValue, completionHandler: { (time) -> Void in
                //
            })
             
            // Adjust the iso to clamp between minIso and maxIso based on the active format
            let minISO = device.activeFormat.minISO
            let maxISO = device.activeFormat.maxISO
            let clampedISO = isoValue * (maxISO - minISO) + minISO
             
            device.setExposureModeCustomWithDuration(AVCaptureExposureDurationCurrent, ISO: clampedISO, completionHandler: { (time) -> Void in
                //
            })
             
            device.unlockForConfiguration()
        }
    }
}

첫번째 새로운 함수의 이름은 updateDeviceSettings이다. 이것은 우리가 초점 이상을 추가한 이유이다. 우리는 또한 고유한 값으로 focusValue와 isoValue을 지정했다. 

 

다음으로, 우리는 minISO와 maxISO 저장 코드의 추가적인 비트 뒤에 초점의 설정과 일반적인 잠금을 한다.  다음 두 값에 비례하여, 어울리게 우리 isoValue를 조정한다. 


예를 들면, 만약 minISO가 50이고, maxISO가 100이면, isoValue에 전달된 0값은 50의 campedISO가 될것이다. 하지만 0.5의 값은 clampedISO의 75가 될것이다. 


이 값을 조절한 후, 우리는 실제 ISO를 설정하는 setExposureModeCustomWithDuration()메소드를 호출할수 있다. 


첫번째 파라미터는 셔터 속도이며, 이 경우에는 셔터 속도를 지정하려 하지 않는다. 그래서 우리는 단순히 상수 AVCaptureExposureDurationCurrent를 사용한다. 이것은 기본적으로 우리가 셔터 시간을 지정하지 않는 것을 말하고, 그냥 ISO를 수정한다. 두번째는, clampedISO 값이고, 마침내 우리는 setFocusModelLockedWithLensPosition 메소드와 마찬가지로 completionHandler를 가진다.


앱을 실행하고, 여러분의 손가락을 화면의 위에서 아래로 밀어 당긴다. 여러분은 일반적인 픽셀 밝기의 차이를 볼수 있나요? 이것은 ISO가 실시간으로 수정된 것이다. 


다음 부분에서, 우리는 약간 깊게 자연스럽게 공부할것이며, 이러한 설정을 좀 더 UI를 구현하여 제어할 것이다.


GitHub 소스 다운로드 : Part 2 on Github





저작자 표시 비영리 변경 금지
신고
Posted by 까칠코더.


티스토리 툴바