티스토리 뷰

반응형

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

오늘은 UIImagePicker쓸 때, 선택된 이미지의 정보를 추출?...해내는법..?

해봅시다. 

일단 보시기 전에 주의할 점이 있습니다. 

iOS Deployment Target에 따라서 코드가 좀 달라지는데, 주의하시길 바랍니다.

Swift 버전은 상관없고, iOS 10~인지 11인지에 따라 달라집니다. 

자신의 iOS Deployment Target이 뭔지 알아보려면, 

Targets > General > Deployment info에 가셔서  Deployment Target을 보시길 바랍니다.

오늘은 10~버전이랑 11~버전 둘다 알아볼거에요. 음...왜 10버전 까지 하냐면...........그냥....아직까지 업데이트...안하신분들을 위해..

그리고 시작하기 전에, Photos를 import해주세요. 



UIImagePicker로 선택된 이미지 정보 알아보기



일단 UIImagePicker사용법은 <내 사진앨범에서 사진 가져오기>에서 설명드렸으니 하지 않겠습니다. 

UIImagePickerControllerDelegate에 있는 



메소드 안에서 여러가지를 얻어올 수 있습니다. 

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])



1. image

image는 <내 사진앨범에서 사진 가져오기>글에서도 가져와봤지만, 또 해봅시다. 

 if let image = info[UIImagePickerControllerOriginalImage] as? UIImage{

                myImageView.image = image

  }



2. imageURL 


<내 사진앨범에서 사진 가져오기>글에서도 말했다 시피, info는 dictionary입니다. 

1번의 이미지는 UIImagePickerControllerOriginalImage라는 key에서 가져왔죠?

imageUrl은 UIImagePickerControllerReferenceURL라는 key에서 가져올 수 있습니다.

 if let imageUrl = info[UIImagePickerControllerReferenceURL] as? URL{

              print(imageUrl)

    }


이렇게요. 그러면, assets-library://asset/asset~~~~로 시작하는 Url을 볼 수 있습니다. 

하지만, iOS11에서는..


UIImagePickerControllerReferenceURL이 deprecate되었습니다....

이거때문에 진짜 너무 고생했는데요 제가 진짜...


이 UIImagePickerControllerReferenceURL로 뭘할 수 있었냐면, fetchAsset을 할 수 있었습니다. 


즉, 나중에는 url로 Asset을 가져오는 건 할 수 없습니다.

진짜 왜 없앴지?...왜지..?



일단, 지금은 저 deprecate된 메소드는 쓸 수 있지만, 나중 release때는 없어질거에요!!


4번에서 설명하긴 할건데, UIImagePickerControllerReferenceURL 대신, UIImagePickerControllerPHAsset이거 쓰라잖아요?

그럼 써봅시다. 


  if let asset = info[UIImagePickerControllerPHAsset] as? PHAsset {

            //code

  }

여기서 제가 또 부딪힌 문제. 

저 asset을 프린트해보면,


이런게 담겨있습니다.

여기서 filename은 안보이지만, 이제 3번에서 할거긴 하지만, Key가 "filename"인걸 가져올 수 있습니다. 하지만....다른 key가 뭐가 있는지 애플문서를 진짜 통째로 뒤져도 안나옵니다...뭐지..


근데 제 예상은, fetchAssets(withALAssetURLs:~)도 deprecate된 마당에, key로 url이 있을 것 같지는 않습니다...

여기의 답변에 따르면, 지금까지 해결방법은 그냥..fetchAssets(withALAssetURLs:~)을 쓰는 것.

아직 Apple측에서 key를 추가하지 않은 것 같다고 해요.




3. image name


iOS 10 ) 일단 2번에서 한 imageUrl이 필요합니다. 

 let imageName = PHAsset.fetchAssets(withALAssetURLs: [imageUrl], options: nil).firstObject?.value(forKey: "filename")
        if let imageName = imageName{
            print(imageName)
        }

또 다른 방법.


  let assets = PHAsset.fetchAssets(withALAssetURLs: [imageUrl], options: nil)

        guard let firstObject = assets.firstObject else { return }

        let fileName = PHAssetResource.assetResources(for: firstObject).first?.originalFilename

        print(fileName)

하지만, iOS 11에서는 이미지 이름을 가져오는 방법이 조금 다릅니다. 

 if let asset = info[UIImagePickerControllerPHAsset] as? PHAsset {

            if let fileName = (asset.value(forKey: "filename")) as? String {

                print(fileName)

            }

        }



4. document directory

if let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first{

            print(documentDirectory)

        }




5. Photo Url

image Url과 다른거같은데..정확한 차이점을 모르겠습니다. 

4번에서의 document directory가 필요합니다. 

 let photoURL   =  URL(fileURLWithPath: documentDirectory)


이렇게 UIImagePicker를 사용해서 선택한 이미지의 여러가지 정보를 알아오는 법을 알아보았는데, 

그럼 이제 fetchAsset으로 딱 하나의 사진만 못가져 오는 건가 ㅠㅠㅠ firstObject로 사진 딱 하나는 가져올 수 있지만 딱 내가 원하는 사진을 가져오는 방법이

PHAsset.fetchAssets(withALAssetURLs:~)이었는데..

혹시 다른방법이 있다면, 댓글이나 PC화면 오른쪽 하단에서 볼 수 있는 메세지기능을 통해 알려주시면 정말 감사하겠습니다 ㅠㅠ 진짜로..

반응형