如何用 PHPickerViewController 中的图像替换 livePhoto?

问题描述

我正在使用 PHPickerViewController 来选择图像和视频。因为我的应用程序存储文件并将它们用于非 iOS 应用程序,所以我对使用 livephotos 不感兴趣。目前我正在使用以下方法从 livePhoto 中提取图像,这归功于我合并的以下两个教程:

https://www.appcoda.com/phpicker/

https://www.limit-point.com/blog/2018/live-photos/

func picker(_ picker: PHPickerViewController,didFinishPicking results: [PHPickerResult]) {
    if results != nil {
        for result in results! {
            let itemProvider = result.itemProvider

            guard let typeIdentifier = itemProvider.registeredTypeIdentifiers.first,let utType = UTType(typeIdentifier)
            else { continue }

            if utType.conforms(to: .image) {
                self.getPhoto(from: itemProvider,isLivePhoto: false)
            } else if utType.conforms(to: .movie) {
                self.getVideo(from: itemProvider,typeIdentifier: typeIdentifier)
            } else {
                self.getPhoto(from: itemProvider,isLivePhoto: true)
            }
        }
    }
}

private func getPhoto(from itemProvider: NSItemProvider,isLivePhoto: Bool) {
    let objectType: NSItemProviderReading.Type = !isLivePhoto ? UIImage.self : PHLivePhoto.self
    if itemProvider.canLoadobject(ofClass: objectType) {
        itemProvider.loadobject(ofClass: objectType) { object,error in
            if let error = error {
                print(error.localizedDescription)
            }
 
            if !isLivePhoto {
                if let image = object as? UIImage {
                    dispatchQueue.main.async {
                        // use image
                    }
                }
            } else {
                if let livePhoto = object as? PHLivePhoto {
                    dispatchQueue.main.async {
                        let livePhotoResources = PHAssetResource.assetResources(for: livePhoto)
                        for resource in livePhotoResources {
                            if resource.type == .photo {
                                let buffer = NSMutableData()
                                var dataRequestID:PHAssetResourceDataRequestID = PHInvalidAssetResourceDataRequestID
                                
                                let options = PHAssetResourceRequestOptions()
                                options.isNetworkAccessAllowed = true
                                
                                dataRequestID = PHAssetResourceManager.default().requestData(for: resource,options: options,dataReceivedHandler: { (data:Data) in
                                    buffer.append(data)
                                    
                                },completionHandler: { (error:Error?) in
                                    // buffer Now contains the resource data
                                    if let image = UIImage(data: buffer as Data) {
                                        // use image
                                    }
                                })
                                
                            } 
                        }
                    }
                }
            }
            
        }
    }
}

这种方法似乎工作正常,我可以获得照片和 livePhoto 的 UIImage。

我想知道是否有更简单的方法解决这个问题? PHPickerViewController 预览只是图像,所以我可以直接为 livePhoto 提取该图像资源吗?

此外,选择器的定义如下:

var config = PHPickerConfiguration()
config.filter = .any(of: [.images,.videos,.livePhotos])
config.selectionLimit = 10
config.preferredAssetRepresentationMode = .current

let controller = PHPickerViewController(configuration: config)

我希望只定义没有 livePhotos 的过滤器就可以让我看到 livePhotos 并让 uiType.conforms(to: .image) 为 livePhotos 返回 true,但事实并非如此。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)