공부

[TIL] AVIF. itemProvider.canLoadObject(ofClass: UIImage.self)가 false로 나오는 건에 대하여

Zedd0202 2023. 10. 11. 13:42
반응형

 

사진첩에서 특정 사진이 불러와지지 않는다는 이슈가 있어 파악해보았다.

해당 사진의 확장자는 AVIF였는데, 처음보는 확장자였다;;

 

# AVIF

AV1 Image File Format, AV1 이미지 파일 형식이라고 한다.

고화질 이미지를 유지하면서 파일 크기를 효과적으로 줄였다고 보면 된다. 

 

https://jakearchibald.com/2020/avif-has-landed/

 

AVIF has landed

AVIF is the first browser image format we've had in 10 years. Let's see how it performs…

jakearchibald.com

위는 JPG, WebP, AVIF 화질을 비교한 링크인데 AVIF가 가장 낮은 파일 크기이면서 여전히 고화질 이미지를 보여준다.

또한, 넷플릭스는 AVIF for Next-Generation Image Coding 글에서 

널리 지원되고, 더 나은 압축 효율성을 가지며, 더 넓은 기능셋을 갖춘 JPEG의 대안으로 AVIF이 잠재력을 갖고 있다고 믿는다


고 썻다.

 

# 이슈 파악

아무튼.. 돌아와서 AVIF를 불러오지 못하는 이유를 파악해봤다. 

PHPicker 글에서도 볼 수 있듯이 (WWDC에서 사용된 예제) 

보통

 itemProvider.canLoadObject(ofClass: UIImage.self) // ✅

이렇게 canLoadObject로 검사하는게 국룰인 것 같다. 

근데 여기서 AVIF의 경우 false가 나오고 있었다. 

itemProvider.loadObject(ofClass: UIImage.self) { (image, error) in 
   ....
}

이렇게 바로 load를 해보면 Could not coerce an item to class UIImage에러가 나온다.

내가 선택한 아이템을 UIImage로 강제할 수 없다? 이런 뜻인듯

 

# 해결

if itemProvider.hasItemConformingToTypeIdentifier(UTType.image.identifier) {
    itemProvider.loadDataRepresentation(forTypeIdentifier: UTType.image.identifier, completionHandler: { data, error in
        // 
    })
}

이렇게 UTType.image.identifier 를 사용하여 불러오도록 변경했다.

UTType.image는 그냥 이미지 파일 형식! 을 나타내는 것 같아서 

if let itemProvider = itemProvider,
       itemProvider.canLoadObject(ofClass: UIImage.self) { // 3
        itemProvider.loadObject(ofClass: UIImage.self) { (image, error) in // 4

        }
    } else {
    
    }
}

위 코드를 썼을 때 처럼 AVIF같이 UIImage로 변경? 캐스팅?;; 이 안되는 친구들도 다 포함할 수 있을 듯 하다?? 

(근데 뭔가 불안해서 canLoadObject에 실패했을 때만 loadDataRepresentation을 하도록 했다 ㅋㅎ..) 

 

왜 AVIF는 UIImage.self로 로드가 안될까..하고 GPT에게 물어봤더니..

AVIF는 UIImage클래스와 직접적으로 연결되어 있지 않으며, AVIF는 별도의 형식으로 AVIF를 로드하려면 AVAsset 또는 관련 AVFoundation클래스를 사용해야 한다고 한다. 

흠.. 글쿤 (반만 믿음) 

반응형