PHAsset 图像在 CollectionView 中显示时像素化

Posted

技术标签:

【中文标题】PHAsset 图像在 CollectionView 中显示时像素化【英文标题】:PHAsset image comes pixelated while showing it in CollectionView 【发布时间】:2016-07-27 10:09:21 【问题描述】:

我有这段代码,我在 collectionView 中使用它来获取图像。

           // Code in CollectionView's cellForItemAtIndex

           // Image

                PHImageManager.defaultManager().getPhoto(asset, size: cell.thumbnail.frame.size)  (image) in

                    if let properImage = image
                    
                        dispatch_async(dispatch_get_main_queue(), 
                            cell.thumbnail.image = properImage
                        )
                    
                    else
                    
                        cell.thumbnail.image  = UIImage()
                    
                

还有getPhoto 方法。

//MARK: PHImageManager

extension PHImageManager

    func getPhoto( asset : PHAsset, size : CGSize, completion : (image : UIImage?) -> ())
    
        let options = PHImageRequestOptions()
        options.networkAccessAllowed = true
        options.synchronous = false
        options.resizeMode = PHImageRequestOptionsResizeMode.Exact
        options.deliveryMode = PHImageRequestOptionsDeliveryMode.HighQualityFormat

        _ = self.requestImageForAsset(asset, targetSize: size, contentMode: PHImageContentMode.AspectFit, options: options, resultHandler: 

            result , _ in

            if let resultValue  = result as UIImage?
            
                completion(image: resultValue)
            
            else
            
                completion(image: nil)
            
        )
    

每当我将图像加载到 collectionView 中时,我都可以看到可见单元格的图像是像素化的。当我滚动浏览图像时,它以高质量的图像正确显示。

我也尝试了resizeModedeliveryMode 的所有组合,但对我没有帮助。我也尝试过启用synchronous

我想显示hight quality images in the first time 本身。我不想滚动浏览collectionView 来获取它。

有没有办法解决这个问题?提前致谢。

【问题讨论】:

【参考方案1】:

您需要根据屏幕的比例缩放图像大小,如下所示:

let retinaMultiplier = UIScreen.main.scale let size = CGSize(width:self.bounds.size.width * retinaMultiplier, height: self.bounds.size.height * retinaMultiplier)

并将此大小传递给您的 requestImageForAsset 方法的 targetSize

并确保您为资产提取选择了正确的选项。

【讨论】:

以上是关于PHAsset 图像在 CollectionView 中显示时像素化的主要内容,如果未能解决你的问题,请参考以下文章

从 PHAsset 确定图像 MB 大小

PHAsset 图像在 CollectionView 中显示时像素化

照片框架 - 如何从 PHAsset 获取图像的 CLLocation?

在核心数据中保存 PHAsset?

用于反应本机应用程序的 PHAsset 图像 URI

使用本地图像 URL 或 UIIMage 获取 PHAsset?