iPhone 3.1 beta 3에서 camera 변경된 점

사용자 삽입 이미지

 
iPhone에도 3.1 부터 AR(증강현실)을 사용가능? 의 포스트에서 밝힌 바와 같이
슬슬 Camera와 관련한 사용자의 니즈를 반영하고 있는 것 같은데요.

09년 7월 27일 부로 베타 3가 나왔습니다.

cameraOverlayView와 관련해서는 아래의 문서를 참고바랍니다.

http://developer.apple.com/iphone/prere ··· rlayview

3.0 OS 까지 Camera Preview를 볼 수 있는 방법은 UIImagePickerController 이용하는 것이었습니다.
그러나 이 클래스의 역할은 modal 창으로 떠서 단 한장의 사진을 얻어서 사라지는 것이었습니다.

심지어 2.x 버전에서는 아래아 같이 시커먼 검은띠가 달린 거슬리는 화면 구성을 가지고 있었구요.

사용자 삽입 이미지

그러나 3.1 부터는
- (void)takePicture

라는 메소드를 추가하였습니다.
즉, 프리뷰를 보면서 사진을 여러장 찍을 수 있게 지원을 하고 있습니다.


그러나 현재 preview 프레임에 접근하는 것 까지는 공개하지 않았네요.
takePicture 함수를 호출하면 기존과 같이
UIImagePickerControllerDelegate
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
가 호출되는데 사실 1600*1200 해상도로 사진을 찍기 때문에 1초 정도가 걸립니다.

Computer Vision 기술을 사용하는 AR은 프레임을 얻어야 가능한데
1초가 걸리는 takePicture 함수로 하기는 아무래도 아직 무리가 있겠습니다.

단지, CoreLocation 정보를 이용해서 Compass값, 위도, 경도를 적절하게 Visual 하게 표현하여
AR 어플리케이션이 나올 가능성은 많습니다.


아래는 이번 추가된 API를 사용하여 카메라 프리뷰 줌을 만들어 봤습니다.



 Custom Camera OverayView를 하나 만들고 Muti-touch가 가능하게 옵션을 주고
touch가 일어났을 때 아래와 같이 UIImagePickerController 의 cameraViewTransform 만 변경시킨 것입니다.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    if([touches count] == 2){
        NSArray * twoTouches = [touches allObjects];
        UITouch * first = [twoTouches objectAtIndex:0];
        UITouch * second = [twoTouches objectAtIndex:1];
        initialDistance = distanceBetweenPoints([first locationInView:self], [second locationInView:self]);
    }
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    if([touches count] == 2){
        NSArray * twoTouches = [touches allObjects];
        UITouch * first = [twoTouches objectAtIndex:0];
        UITouch * second = [twoTouches objectAtIndex:1];
       
        CGFloat currentDistance = distanceBetweenPoints([first locationInView:self], [second locationInView:self]);
        if(initialDistance == 0)
            initialDistance = currentDistance;
        else {
            CGFloat difference = currentDistance - initialDistance;   
            if(difference > 10){
                scaleFactor+= 0.1;
                initialDistance = currentDistance;
            }
            else if (difference < -10)
            {
                scaleFactor-= 0.1;
                initialDistance = currentDistance;
            }
           
            if(scaleFactor > 3)    scaleFactor = 3;
            if(scaleFactor < 0.3) scaleFactor = 0.3;
               
            scaleLabel.text = [NSString stringWithFormat:@"%.2f", scaleFactor];
            picker.cameraViewTransform = CGAffineTransformMakeScale(scaleFactor, scaleFactor);
        }
    }
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    initialDistance = 0;
}


chaoskcuf
프로그래밍/iPhone 2009/07/29 15:03

트랙백 주소 : http://chaoskcuf.com/trackback/245

댓글을 달아 주세요

  1. statcomp 2009/08/06 06:38  수정/삭제  댓글쓰기

    안녕하세요.

    한글로 쓴 아이폰 앱 개발 블로그는 처음 접하는데 내용도 상당히 좋은 것 같습니다. 앞으로도 좋은 글 많이 부탁합니다.

    • chaoskcuf 2009/08/06 10:52  수정/삭제

      하하 감사합니다~
      자주 찾아주세요~

  2. statcomp 2009/08/08 00:52  수정/삭제  댓글쓰기

    저는 비디오 방면에는 익숙하지 않지만 preview frame을 가져오는 방법중 비디오 레코딩을 이용하는 방법은 어떨까요? 레코딩하는 속도는 30fps이니까 라이브로 비디오 내용을 억세스 할수 있다면 가장 빠른 방법 같습니다만 애플이 라이브 비디오 억세스를 못하게 해놓았겠죠?

Powerd by Textcube, designed by criuce
rss