繁体   English   中英

从PHAsset提取缩略图

[英]Fetching thumbnails from PHAsset

我正在尝试从PHAsset获取缩略图以及其他一些信息。 这是一个简化的代码片段。

对于我从相机胶卷中检索到的所有图像,请执行以下操作:

static func fetchAsset(asset: PHAsset)
{
        if(asset.mediaType == PHAssetMediaType.Image){
            let screenScale: CGFloat = UIScreen.mainScreen().scale
            let imageSize = CGSize(width: 100 * screenScale, height: 100 * screenScale)

            let options: PHImageRequestOptions = PHImageRequestOptions()
            options.deliveryMode = PHImageRequestOptionsDeliveryMode.FastFormat
            options.resizeMode = PHImageRequestOptionsResizeMode.Fast
            options.synchronous = false

            PHImageManager.defaultManager().requestImageForAsset(asset,
                targetSize: imageSize,
                contentMode: PHImageContentMode.AspectFill,
                options: options,
                resultHandler: { (result, info) -> Void in
                    if (result != nil && result!.scale == screenScale) {

                        var newItemImage = MyImage(isLocal:true)
                        if let fname = asset.valueForKey("filename") as? String{
                            newItemImage.fileName = fname
                        }
                        newItemImage.thumbnail = result
                        asset.requestContentEditingInputWithOptions(PHContentEditingInputRequestOptions()) { (contentEditingInput, info) -> Void in

                            //Get full image
                            let url = contentEditingInput!.fullSizeImageURL

                            newItemImage.url = url
                        }
                        //DO SOMWTHING WITH IMAGE
                    }else
                    {
                        //DO SOMWTHING ELSE
                    }
            })
        }
    }

在此阶段,我有两个问题:

  1. 最重要的一个,但我想是必然的。 它需要太多的处理能力并无法从光盘读取数据。 它在模拟器中工作正常。 但是,当我在具有300-500张图像的测试设备(iPhone 5、4S)上运行它时,它冻结一两分钟,同时获取所有图像。 我猜它会逐个读取整个集合,调整大小并获取所有这些信息。 有没有更简单的方法? 就像使用ALAsset可能的那样,我可以直接获取缩略图,并且飞速发展。
  2. 由于某种原因,它做了两次工作。 首先,它给了我我所要的东西,小缩略图〜60 * 40或附近。 一旦给了我,在几秒钟之后,它又进行了另一个循环,并开始检索更高分辨率的图像,例如960 * 640左右,这就是冻结发生的地方。 我不确定为什么会这样,但是确实如此。

在这两个问题上的任何投入将不胜感激。

由于某种原因,它做了两次工作

因为那是应该做的。 如您所知,从照片库中获取图像需要花费时间。 因此,默认行为是我们尽快提供低分辨率图像,以便您可以显示一些内容。 然后,我们可能会多次调用图像质量更高的版本。 而且,提取是异步形成的。 因此,完全有可能最终同时发生多个获取请求,这可能导致您的代码开始踩到自己的脚,正如您所发现的那样。

如果您不喜欢这样,请将fetch选项synchronous设置为true ,但是您必须在后台队列中进行整个调用! 通过在串行队列中执行此操作,可以确保依次依次执行调用,并且每个图像将仅发送一次。 此外,然后(并且仅在那时)您的PHImageRequestOptions.DeliveryModeFastFormat将被遵守。 在对收到的图像进行任何处理之前,请不要忘记退回到主线程!

您也可以使用我写的这个扩展名:

import Photos

extension PHAsset {
    var thumbnailImage : UIImage {
        get {
            let manager = PHImageManager.default()
            let option = PHImageRequestOptions()
            var thumbnail = UIImage()
            option.isSynchronous = true
            manager.requestImage(for: self, targetSize: CGSize(width: 300, height: 300), contentMode: .aspectFit, options: option, resultHandler: {(result, info)->Void in
                thumbnail = result!
            })
            return thumbnail
        }
    }
}

暂无
暂无

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

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