티스토리 뷰

반응형

 

안녕하세요 :) Zedd입니다.

모두 설날 연휴 잘 보내셨나요!?

저는 이렇게,,,빨리,,,연휴가 갈 수 있구나,,라는 사실을,,,새삼 느끼며,,,

롤과 운동으로 연휴를 보냈읍니다...

 

아무튼 오늘은 UIImagePickerController()로 촬영한 사진/동영상을 저장하는 법을 공부해볼게요!!

 

https://zeddios.tistory.com/125

 

iOS ) 내 사진앨범/카메라에서 이미지 가져오기

안녕하세요 :) Zedd입니다. 오늘 해볼거는 내 사진앨범에 있는 이미지를 가져오거나, 카메라로 찍은 이미지를 가져올거에요. 너무 잼나겠다 그쵸 ㅎㅎ 오늘 우리가 만들어볼거는 바로 요런거 입니다 ㅎㅎ (아 ㅠ..

zeddios.tistory.com

 

이거 말고..

그 받은 이미지를 가져와서 뿌리는것만이 아닌 내 사진앨범에!!!!

저장하는 법을 공부해볼거에요.

 

그래서 생략되는 부분이 굉장히 많을듯한 ^-^...소스코드는 github에 올리도록 할게요 ~_~

 

간단히 플로우를 설명드리자면...

버튼이 하나 있고 그 버튼을 누르면 사진/동영상을 촬영 할 수 있는 카메라가 나옵니다.

그리고 거기서 사진/동영상을 찍고 이 사진/동영상 사용을 누르면...내 사진앨범에 사진/동영상이 저장되는겁니다.

 

먼저 카메라 쓸라면 권한 얻어야함 ㅎ...

 

1. 버튼을 눌렀을 때 UIImagePickerController가 Present되도록 한다. 

 

그러면

 

이런 화면이 나옵니다. 

난 지금 앨범이 보고싶은게 아니고...카메라 보여달라고

 

sourceType을 camera로 지정해줍니다. 기본값은 UIImagePickerController.SourceType.photoLibrary.

 

 

그럼 성공적으로 카메라가 나오게됨.

 

근데 저기 PHOTO라고 사진만 있잖아요?

그러니까 지금 사진촬영만 되고 비디오 촬영은 안되는 상태잖아요~

비디오 촬영이 되게 추가해줍시다. 

 

그 전에 역시 비디오 촬영을 하려면..권한을 하나 얻어야합니다.

바로 마이크 사용

 

ㅇㅇ

 

그리고 

뭐 인터넷 찾아보시면..

mediaTypes란게 있는데..

 

뭐 저렇게 해ㄹ ㅏ~~ 라고 나올겁니다. (mediaTypes는 String배열을 받습니다.)

 

근데 저는 이게 참............................맘에 안드네욥

kUTType저것도 그냥 쓸 수 있는것도 아니고....

MobileCoreServices를 import해야 자동완성이 됩니다.

떼잉......쯧..

또 한 한달 안보면 까먹을각/!?!?!?

 

그래서 좀 찾아보니까 class 메소드가 있는걸 발견..

 

UIImagePickerController에 availableMediaTypes(for: )이라는 class메소드가 있습니다.

그래서

 

이렇게 해주면 저런 String배열이 나오게 됩니다.

딱 2개 있는거임 ㅇㅇ 

 

그래서 저걸 넣어줄게요~~

 

그러면

 

PHOTO말고 VIDEO도 추가된 것을 볼 수 있습니ㄷ ㅏ!!

 

이제 반 했네요.

 

 

이렇게 찍은걸 저 Use ~ 를 누르면 내 사진앨범에 저장하고 싶습니다.

 

저 Use를 누르면 불리는 Delegate메소드가 있는데요. 아까 우리가 정의해준

 

이친구.

UIImagePickerControllerDelegate의 메소드입니다.

 

그럼 여기서 저장하면 되겠네????

ㅇㅇ

 

 

여기서 2가지 방법이 있습니다.

하나씩 해볼게요.

 

1. 

이런 메소드가 있습니다. 잘 안보이네요...

아무튼 이름만 봐도...

 

UIImageWriteToSavedPhotosAlbum

응 앨범에 이미지 저장이야~

 

UISaveVideoAtPathToSavedPhotosAlbum

응 앨범에 비디오 저장~~

 

ㅇㅇ써보겠음.

먼저 앨범에 "저장"을 할거니까 앨범에 사진을 추가할 수 있는 권한을 얻어야 합니다. 

 

 

ㅇㅋ

 

먼저 UIImageWriteToSavedPhotosAlbum부터 볼게요.

image를 받고,,completionTarget과 completionSelector를 받네요. 그리고 contextInfo까지,,,

image는 내가 저장할 이미지를 넣는거겠죠?

completionTarget는 selector가 호출되는 객체이니 self를 넣어주면 되고,

completionSelector는 이제 Selector를 넣어줘야하는데...

(void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo

 

이런 form을 가지고 있어야 한다고 합니다.

 

contextInfo는 completionSelector에 전달하는 특정 데이터에 대한 포인터라고 해요. nil을 넣어줄겁니다.

 

그럼 작성 고고

 

코드는 전부 github에 올릴거니까..이미지라고 뭐라 그러지 마십셔

암튼 이렇게 해주면 use Photo를 누르면 사진이 성공적으로 저장되게 됩니다. 

 

아 그리고 Use Photo를 누르면 UIImagePickerController를 dismiss해주겠습니당

 

 

그럼 비디오를 저장해볼게요.

UISaveVideoAtPathToSavedPhotosAlbum

을 사용하면 될 것 같습니다.

 

image와 다르게 videoPath인 String을 받네요. 그 외엔 같습니다. 

그리고 역시나 completionSelector는 저런 form을 가져야합니다.

 

오 근데

 

이런게 있ㄴ에ㅛ. 

지정된 비디오를 사용자의 카메라 롤 앨범에 저장할 수 있는지 여부를 나타내는 Bool값...

그럼 검사 함 해야겠네;;;

 

 

자 그래서

 

이렇게 해주면 됩니다. 사진의 mediaURL은 nil이 나오더라구요.

그래서 kUTType으로 비디오인지 검사하는 로직은 따로 안넣어줬어요.

 

아무튼 돌려보시면 성공적으로...사진과 비디오가 저장되는 것을 볼 수 있습ㄴ니다.

 

위에서 2가지 방법이 있다고 그랬죠?

나머지 방법을 이용해서 사진/동영상을 저장해볼게요. 

 

바로 Photos프레임워크의 PHPhotoLibrary클래스를 이용하는 것입니다.

 

PHPhotoLibrary는 이름에서도 볼 수 있듯이..

유저의 사진 라이브러리에 대한 접근 및 변경을 관리하는 shared객체에요.

PHPhotoLibrary가 할 수 있는 일들은

 

1. 사진 콘텐츠에 접근 할 수 있는 사용자의 권한 얻기 또는 확인

2. asset과 collection변경. ex.  asset 메타데이터/컨텐츠 편집, 새로운 asset 삽입, collection 멤버 재배열 등..

3. 라이브러리가 변경될 때 전송되는 업데이트 메세지 등록

 

이 있대요.

우리는 2번 기능을 쓰겠죠?

 

한번 해봅시다.

 

Use Photo를 누르면

 

이게 불린다고 그랬죠? 이 안에서 해줍시다. 

 

PHPhotoLibrary에 있는 performChange가 변경을 수행하는 블록이라서

 

일단 이렇게 해줍니다. 

그리고 항상 performChanges블록에서 해야할 일은 request를 만드는것입니다.

그게 생성, 삭제, 변경 뭐가 됐든요. 

 

PHAssetChangeRequest라는 클래스가 또 있씁니다.

 

 

add, Delete, modify등을 할 수 있는 메소드가 깔쌈하게 ㅈㅔ공이 됩ㄴ다.

응 난 add할거~

 

이미지 하나만 있으면...만들 수 있군요. 

 

이친구는

Privacy - Photo Library Additions Usage Description

로는 부족하고..

 

Privacy - Photo Library Usage Description도 추가해줘야합ㄴ디ㅏ. 

암튼 추가해주고

 

아 코드가 왤케 안읽히지....

암튼 이렇게 해주면 됩니다. 

 

그럼 비디오도 해볼게요.

 

걍 똑같음;;;;;

 

https://github.com/Zedd0202/Create-Asset/tree/master

 

Zedd0202/Create-Asset

Contribute to Zedd0202/Create-Asset development by creating an account on GitHub.

github.com

 

아 정리 좀 하고싶었는데 해서 기분 좋군...

 

모두들 손 깨끗이 씻으시고..! 신종 코로나 바이러스 조심하세요!

 

 

 

 

반응형