[TIL] AVIF. itemProvider.canLoadObject(ofClass: UIImage.self)가 false로 나오는 건에 대하여
사진첩에서 특정 사진이 불러와지지 않는다는 이슈가 있어 파악해보았다.
해당 사진의 확장자는 AVIF였는데, 처음보는 확장자였다;;
# AVIF
AV1 Image File Format, AV1 이미지 파일 형식이라고 한다.
고화질 이미지를 유지하면서 파일 크기를 효과적으로 줄였다고 보면 된다.
https://jakearchibald.com/2020/avif-has-landed/
위는 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클래스를 사용해야 한다고 한다.
흠.. 글쿤 (반만 믿음)