티스토리 뷰

Core Image tutorial Part. 3

 

(Ray wenderlich - Core Image tutorial: Getting Started 번역)

 

 

3편 시작)

 

Getting Photos from the Photo Album

 

필터로 값을 적용하는 것을 성공했으니, 더 흥미로운 것을 해보죠.

꽃 사진이 마음이 안든다면 어떻게 해야할까요?  

다음으로는 UIImagePickerController 를 사용해서 앨범에서 사진을 가져와 보도록 하겠어요.

 

Main.storyboard 를 열고, "버튼" 을 가져와서 이미지 뷰에 가리지 않게 추가하고, 오토레이아웃을 자유롭게 잡아주세요.

"사진 앨범" 이라는 이름을 붙여줍니다. 

 

동시에 뷰 컨트롤러를 열고, 컨트롤 + 드래그 를 이용해 버튼을 뷰 컨트롤러로 끌어오세요.

Action 을 연결하고, loadPhoto 라는 이름을 붙여줍니다. 

참 ! 이벤트는 .touchUpInside 로 설정해주시고, Connect 를 눌러 마무리 해주세요.

 

loadPhoto 메소드의 구현은 다음과 같습니다.

첫 줄은 새로운 UIImagePickerController 의 인스턴스를 생성하며,

두 번째 줄은 UIImagePickerController 의 델리게이트를 ViewController(= self) 로 지정하며,

세 번째 줄은 ImagePickerControllerpresent 합니다.

 

또 중요한 것은 ViewController 가 UIImagePickerControllerDelegateUINavigationControllerDelegate 를 준수해야만 합니다.

다음의 메소드를 이제 구현해주세요.

 

(self.dismiss 위에 print(info) 를 추가해주세요)

 

UIImagePickerControllerDelegate 메소드는 아직 완성되지 않았어요. 우리가 어떤 UIImagePickerControllerDelegate 메소드를 구현할 때, 우리는 명시적으로 우리의 구현 내용에 UIImagePickerControllerdismiss 해주도록 처리해주어야만 해요. 그렇게 하지 않으면 영원히 UIImagePickerController 는 사라지지 않을거에요... (끔찍)

 

앱을 실행시켜서 버튼을 눌러봅시다. 이미지 피커 컨트롤러가 나타날 것입니다 :)

이미지를 선택해보고, 콘솔창을 확인해보세요.

 

이미지에 대한 다양한 정보들을 확인할 수 있습니다. MediaType, ReferenceURL 등이 보이네요.

이제 이미지를 선택하는 방법을 얻었어요. 어떻게 이것을 beginImage 로 사용할까요?

간단히 델리게이트 메소드를 다음과 같이 업데이트해주세요.

 

(필터를 적용하려면) 선택한 사진에서 새로운 CIImage 를 생성할 필요가 있습니다. 딕셔너리의 값 안에서 사진의 UIImage 표현(representation) 을 발견함으로서 이것을 얻을 수 있어요. (= 쉽게 이야기해서 아까 사진을 찍었을때 info 를 프린트 찍었는데 그 내용을 보면 [UIImagePickerControllerOriginalImage] 가 있었어요. info 는 딕셔너리인데 info[UIImagePickerControllerOriginalImage] 로 info 의 [UIImagePickerControllerOriginalImage] 에 해당하는 값을 찾아온다는 것이죠. 제가 선택한 사진에 대한 info[UIImagePickerControllerOriginalImage] 를 확인해보니 <UIImage: 0x280c712d0> 가 찍혀있네요. 0x280.. 어쩌고는 메모리 주소인데, 이 메모리 주소로부터 이미지를 가져오는 것 같습니다.) 그래서 이것을 UIImage 로 강제 캐스팅(as!)을 해서 사용하고자 했습니다.)

 

이 이미지를 CIImage 객체로 변환하기 위해 "CIImage(image:)" 생성자를 사용합니다.

그래서 우리는 입력한 이미지가 방금 생성한 새로운 CIIImage 가 되도록 필터 딕셔너리 내의 키를 설정합니다.

 

마지막 줄이 이상해 보일 수도 있겠어요. (전에 보았던) "changeValue" 의 코드가 최신의 값으로 필터를 실행하고 이미지 뷰를 (실행) 결과와 함께 업데이트하는지를 제가 어떻게 언급했었는지를 떠올려보세요.

 

다시 작업을 해야하므로, "changeValue" 를 단지 호출하면 됩니다. (+ "changeValue" 는 현재 슬라이더의 IBOutlet 프로퍼티 였었죠) 비록 슬라이더의 값이 변하지 않았음에도(+ 이미지 피커 컨트롤러에서는 단지 사진을 골랐을 뿐이지 슬라이더의 값을 건드린건 아니니까요), 우리는 여전히 메소드의 코드를 작업을 완료하기 위해 사용할 수 있어요. 물론 이 부분을 자신의 메소드로 코드를 쪼갤 수 있긴 하지만, 이 경우에는 그렇지 않으니 패스하겠습니다. (amountSliderValueChanged 의) "sender" 로서 "amountSlider" 를 전달하여 사용할 올바른 값을 갖도록 하세요. (이 내용이 조금 어렵다면 쉽게 슬라이더의 값을 가져와서 메소드를 실행할 수 있다고 생각하시면 되겠습니다. 이렇게 줄이니 뭔가 현타오네요..)

 

이제 앨범으로부터 어떤 이미지든 업데이트를 할 수 있게 되었어요.

 

우리가 퍼펙트한 세피아 이미지를 생성한다면, 어떻게 그것을 가질 수 있을까요? 우리는 스크린 샷을 찍을 수도 있을거지만, 적절한 방식은 아무래도 필터가 적용된 사진을 다시 사진 앨범에 저장하는 것이겠죠...?

 

다음 시간에는 앨범에 다시 저장하는 방법부터 알아보겠습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함