如何将 PHLivePhoto 转换为 UIImage?

nin*_*inu 1 swift photokit

在我的应用程序中,我有一段代码,我需要在其中考虑 PHLivePhoto 类型对象并将其转换为 UIImage。PHAsset我相信它与、PHAssetResource或有关,PHImageManager但不清楚如何执行转换。从 PHLivePhoto -> UIImage 转换的好方法是什么?谢谢您的帮助!

if let livePhoto = object as? PHLivePhoto {
    let livePhotoResources = PHAssetResource.assetResources(for: livePhoto)
    print("\(livePhotoResources)")
    
    // imageBucket is of type UIImage[]
    // livePhoto is of type PHLivePhoto but I don't know how to convert this to type PHAsset
    viewModel.imageBucket.append(convertImageAsset(asset: **WHAT_DO_I_INSERT_HERE**))
}
Run Code Online (Sandbox Code Playgroud)

...

func convertImageAsset(asset: PHAsset) -> UIImage {
            let manager = PHImageManager.default()
            let option = PHImageRequestOptions()
            var tmpImage = UIImage()
            option.isSynchronous = true
            manager.requestImage(
                for: asset,
                   targetSize: CGSize(width: asset.pixelWidth, height: asset.pixelHeight),
                   contentMode: .aspectFit,
                   options: option,
                   resultHandler: {(result, info)->Void in
                       tmpImage = result!
                   })
            return tmpImage
        }
Run Code Online (Sandbox Code Playgroud)

结果是:

[<PHAssetResource: 0x28225cdc0> {
    type: photo
    uti: public.heic
    filename: IMG_5442.heic
    asset: (null)
    locallyAvailable: YES
    fileURL: file:///private/var/mobile/Containers/Data/Application/2FB56305-7600-4A8E-9C67-A71B4A4A9607/tmp/live-photo-bundle/75FD3D97-F13E-4F79-A6E9-F0743D443FDD.pvt/IMG_5442.HEIC
    width: 0
    height: 0
    fileSize: 0
    analysisType: unavailable
    cplResourceType: Unknown
    isCurrent: NO
    isInCloud: NO
}, <PHAssetResource: 0x28226bc00> {
    type: video_cmpl
    uti: com.apple.quicktime-movie
    filename: IMG_5442.mov
    asset: (null)
    locallyAvailable: YES
    fileURL: file:///private/var/mobile/Containers/Data/Application/2FB56305-7600-4A8E-9C67-A71B4A4A9607/tmp/live-photo-bundle/75FD3D97-F13E-4F79-A6E9-F0743D443FDD.pvt/IMG_5442.MOV
    width: 0
    height: 0
    fileSize: 0
    analysisType: unavailable
    cplResourceType: Unknown
    isCurrent: NO
    isInCloud: NO
}]
Run Code Online (Sandbox Code Playgroud)

Ale*_*nko 7

已接受答案的问题是获取遗嘱PHAsset需要访问照片库,其主要优点之一PHPickerViewController是无需请求权限即可获取照片,并完全避免所有相关的边缘情况。

因此,获取实时照片图像的另一种方法是:

func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
    for result in results {
        // Live photos
        if result.itemProvider.canLoadObject(ofClass: PHLivePhoto.self) {
            result.itemProvider.loadObject(ofClass: PHLivePhoto.self, completionHandler: { livePhoto, error in
                let resources = PHAssetResource.assetResources(for: livePhoto as! PHLivePhoto)
                let photo = resources.first(where: { $0.type == .photo })!
                let imageData = NSMutableData()
                
                PHAssetResourceManager.default().requestData(for: photo, options: nil, dataReceivedHandler: { data in
                    imageData.append(data)
                }, completionHandler: { error in
                    _ = UIImage(data: imageData as Data)!
                })
            })
        }
    }
}
Run Code Online (Sandbox Code Playgroud)