본문으로 바로가기

틀린내용이 있을수 있습니다

혹시 틀린내용이 있다면 알려주시면 감사하겠습니다:)

 

오늘은 포토킷에 대해서 알아볼거임

글 올리는 순서가 뒤죽박죽인것같은데 그냥 올리고싶은거 올렬려함

지금 정리 안하면 까먹을것같기도 하고

 

PhotoKit이란?

포토킷이란 iOS, macOS, tvOS에서 사진앱에서 관리하는 사진 및 비디오에 액세스하게 해주는 프레임워크임

포토킷을 사용하면 사진이나 비디오를 가져와서 표시 및 재생을 하고 편집이나 앨범같은 컬렉션도 관리할 수 있음

PHAsset

사진앱에 있는 이미지, 비디오, LivePhoto 하나를 나타냄

PHAsset은 사진의 메타데이터를 나타내며 이 객체 자체가 사진이 아님

 

PHAssetCollection

사진앱에 있는 앨범임

 

PHCollectionList

 

사진앱에 있는 폴더임

난 사진앱에서 폴더를 만들수 있다는걸 처음알았음

이런식으로 사진앱의 앨범탭에서 만들수 있음

폴더에는 사진자체를 보관할수 없고 앨범만 만들수 있음

 

대충 이런 구조로 돼있다고 보면 됨ㅇㅇ

 

FetchMethod

객체를 불러오기 위해선 불러올려는 객체의 타입메서드를 호출하면 됨

예를들어 PHAsset의 객체를 불러올려면 PHAsset.fetchAsset,

앨범을 불러올려면 PHAssetCollection.fetchAssetCollection

이렇게 하면 된다 이거임

리턴값으론 PHFetchResult를 뱉어줌

 

PHFetchResult

fetch method를 통해 반환된 asset이나 컬렉션의 리스트임

사진을 불러오면 한장씩 불러오는 경우도 있으나 여러장을 한번에 불러오는 경우도 있을거아님

컬렉션뷰의 셀에 뿌려준다든가

 

얘는 제네릭타입으로 제네릭 타입에 맞는 객체만 결과로 받아올수 있음

예를들면 PHFetchResult<PHAsset> 타입에는 PHAsset만 받을수 있고 PHAssetCollection같은건 못받겠지

 근데 이 자체가 객체의 배열은 아니고 클래스 안에 객체의 배열이 있는 형식이라 하나하나 꺼내써야함

 

다행히 얘는 서브스크립트가 구현돼있어서 인덱스로 객체 하나에 접근이 가능함

또한 배열에 구현된 메서 랑 비슷한 firstObject나 contains, count같은 이름만 들어도 무슨 역할을 할지 알것같은 메서드들이 구현돼있음

PHFetchOptions

fetch 할때 결과의 정렬이나 필터링등 옵션을 설정할수 있음

PHImageManager

얘가 이제 메타정보인 PHAsset을 가지고 실제 사진을 가져오는얘임

싱글톤으로 구현돼있는 얘라 PHImageManager.default.requestImage 이런식으로 접근하면 됨

얘는 기본적으로 비동기로 실행함

그리고 혹시 이미지 용량이 커서 이미지 받아오는 시간이 좀 걸린다 하면 저사양 이미지를 먼저 주고 다음에 받아온 이미지를 줄수도 있다고 함

requestImage 메서드의 파라미터들인데 하나씩 대충 살펴보겠음

 

asset: 사진을 뽑아올 메타데이터를 가지고있는 PHAsset 객체임

targetSize: 얘가 좀 골때리는데 받아올 이미지의 사이즈임

size가 너무 크면 당연히 받아오는 시간이 좀 걸림

한장만 받아온다면 뭐 크게 문제 없겠지만 콜렉션뷰에 뿌려줄때처럼 한번에 많은 양의 이미지를 받아올경우에는 size를 좀 작게 하는걸 추천함. 물론 그렇다고 너무 실제 표시할 사이즈보다 더 작게하면 화질이 안좋으니까 조심해야함

contentMode: 이미지의 비율? 같은거임 AspectFill같은거 다들 알거라 믿겠음 그걸 여따가 설정해주는거임

targetSize랑 실제 이미지랑 다를때 어쩔건지 설정해주는거임ㅇㅇ

options: 밑에서 살펴볼거임

resultHandler: 받아온 이미지를 받는 탈출클로저임

위에서 말했다시피 이미지 용량이 큰경우 저사양 이미지랑 요청한 이미지랑 해서 두번 실행될수 있다함

 

PHImageRequestOptions

이미지를 받아올때 옵션임

이것도 하나하나 살펴보겟음

내가 써본것으로만ㅋ

 

isSynchronous: 이미지 요청을 동기적으로 처리할지 여부임 

기본값은 false로 비동기 요청임. 만약 동기적으로 처리하게 되면 resultHandler가 두번호출되는 일은 없다함

deliveryMode: 이미지 품질임

                            .fastFormat: 품질은 떨어지나 속도가 빠른 모드임

                            .highQualityFormat: 속도가 얼마나 걸리든 최고품질을 주는 모드임     

 

                            .opportunistic: 상황봐서 위 두게를 적절히 제공하는 모드임

resizeMode: 이미지의 크기를 조정하는 옵션임

                        .none: 리사이즈 안함

                        .fast: targetSize와 비슷하거나 살짝 크게 효율적으로 조정함

                        .exact: targetSize와 정확히 일치시킴

 

이렇게 오늘은 이미지를 받아오기 위한걸 알아봤고 다음엔 이미지 메타정보를 수정하는 법과 사진앱에서 사진을 수정했을때 바로 적용시키는 법을 알아보겠음

 

참고

https://zeddios.tistory.com/614?category=682195 

 

iOS ) PhotoKit (1)

안녕하세요 :) Zedd입니다. 오늘은 PhotoKit을 공부해보려고 합니다. PhotoKit PhotoKit도....프레임워크라고 할 수 있겠죠? 프레임워크라고 언급이 안되어있긴 한데........ Objc에서 프레임워크라고 언급

zeddios.tistory.com

https://developer.apple.com/documentation/photokit/phasset/

 

Apple Developer Documentation

 

developer.apple.com