티스토리 뷰
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) 로 지정하며,
세 번째 줄은 ImagePickerController 를 present 합니다.
또 중요한 것은 ViewController 가 UIImagePickerControllerDelegate 와 UINavigationControllerDelegate 를 준수해야만 합니다.
다음의 메소드를 이제 구현해주세요.
(self.dismiss 위에 print(info) 를 추가해주세요)
UIImagePickerControllerDelegate 메소드는 아직 완성되지 않았어요. 우리가 어떤 UIImagePickerControllerDelegate 메소드를 구현할 때, 우리는 명시적으로 우리의 구현 내용에 UIImagePickerController 를 dismiss 해주도록 처리해주어야만 해요. 그렇게 하지 않으면 영원히 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" 를 전달하여 사용할 올바른 값을 갖도록 하세요. (이 내용이 조금 어렵다면 쉽게 슬라이더의 값을 가져와서 메소드를 실행할 수 있다고 생각하시면 되겠습니다. 이렇게 줄이니 뭔가 현타오네요..)
이제 앨범으로부터 어떤 이미지든 업데이트를 할 수 있게 되었어요.
우리가 퍼펙트한 세피아 이미지를 생성한다면, 어떻게 그것을 가질 수 있을까요? 우리는 스크린 샷을 찍을 수도 있을거지만, 적절한 방식은 아무래도 필터가 적용된 사진을 다시 사진 앨범에 저장하는 것이겠죠...?
다음 시간에는 앨범에 다시 저장하는 방법부터 알아보겠습니다.
'Programming > iOS' 카테고리의 다른 글
iOS - Core Image tutorial(코어 이미지 튜토리얼) (5) (0) | 2019.05.17 |
---|---|
iOS - Core Image tutorial(코어 이미지 튜토리얼) (4) (1) | 2019.05.13 |
iOS - Core Image tutorial(코어 이미지 튜토리얼) (2) (0) | 2019.05.08 |
iOS - Core Image tutorial(코어 이미지 튜토리얼) (1) (3) | 2019.05.06 |
iOS - 초보자를 위한 Grand Central Dispatch (GCD) Part. 2 (0) | 2019.04.24 |
- Total
- Today
- Yesterday
- Operator
- 패캠
- 패스트캠퍼스
- 튜플
- tca
- 타입
- fastcampus
- iOS개발스쿨
- 리터럴
- 컨버전
- ARC
- swiftUI
- Swift
- GCD
- var
- array
- 깃허브
- OOP
- 개발스쿨
- function
- Dictionary
- fallthrough
- 스위프트
- ios
- lifecycle
- 딕셔너리
- 프로그래밍
- 열거형
- inswag
- commit
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |