繁体   English   中英

PhotoKit requestImage 返回低分辨率图像?

[英]PhotoKit requestImage returns low res images?

当使用 Photo Kit 获取图像和视频时,我的图像和视频缩略图在我的 LazyVGrid 中以低分辨率显示。

当我在较大的图像视图中显示图像时,它们也会以低分辨率显示。

我所有的图像和视频都存储在 iCloud 上,所以我在 PHImageRequestOptions() 中设置了isNetworkAccessAllowed = true AND deliveryMode = .highQualityFormat

我尝试将 requestImage 方法中的 targetSize 更改为不同的值,但这也没有改变质量。

我究竟做错了什么?

   @Published var fetchedMediaArray : [MediaAsset] = []

   // model for Assets
   struct MediaAsset: Identifiable, Hashable {
     var id = UUID()
     var image : UIImage
     var selected: Bool
     var asset: PHAsset
   }

   func requestAuth() {/*auth code*/ }

   func fetchPhotosAndVideos() { 
        let opt = PHFetchOptions()
        opt.includeHiddenAssets = false
        opt.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
        opt.predicate = NSPredicate(format: "mediaType == %d || mediaType == %d",
                                             PHAssetMediaType.image.rawValue,
                                             PHAssetMediaType.video.rawValue)
        let req = PHAsset.fetchAssets(with: opt)
        
        DispatchQueue.main.async {
            let options = PHImageRequestOptions()
            options.isSynchronous = true
            options.deliveryMode = .highQualityFormat
            options.isNetworkAccessAllowed = true
            for j in 0..<req.count {
                
                PHCachingImageManager.default().requestImage(for: req[j], targetSize: CGSize(width: 100, height: 100), contentMode: .default, options: options) { (image, _) in
                    let data1 = MediaAsset(image: image!, selected: false, asset: req[j])
                    self.fetchedMediaArray.append(data1)
                   
                 }
             }
         }
     }

当从云端下载照片时,它可能会多次调用您的完成处理程序。

来自PHImageManager.requestImage(for:asset)文档 -

讨论

对于异步请求,照片可能会多次调用您的结果处理程序块。 照片首先调用块以提供适合临时显示的低质量图像,同时它准备高质量图像。 (如果低质量图像数据立即可用,则第一次调用可能会在该方法返回之前发生。)当高质量图像准备就绪时,照片会再次调用您的结果处理程序来提供它。 如果图像管理器已经以完整质量缓存了请求的图像,则照片只会调用您的结果处理程序一次。 结果处理程序的信息参数中的PHImageResultIsDegradedKey键指示照片何时提供临时低质量图像。

您可以在回调处理程序中做什么 -

  1. 如果您的资产以目标/请求的大小(或大于请求的大小)返回,您可以认为它已完成。
  2. 如果您的资产以小于目标/请求的大小返回,您应该检查信息参数中的PHImageResultIsDegradedKey并等待照片下次调用您的完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM