swift2 从PHAsset中获取缩略图

lb3vh1jj  于 2022-11-06  发布在  Swift
关注(0)|答案(2)|浏览(243)

我正在尝试从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.最重要的一个,但我想这是必然的。它需要太多的处理能力和从光盘阅读。它在模拟器中工作正常。但当我运行它在测试设备(iPhone 5,4 S),有300-500张图像,它会冻结一两分钟,同时获取所有的图像。我猜它会一个接一个地阅读整个集合,调整它的大小,并获取所有这些信息。有没有更简单的方法?就像它是可能的与ALAsset,我可以只得到缩略图直接和它飞得很快。
1.由于某种原因,它做了两次。第一次,它给了我我所要求的,小缩略图~ 60 * 40或左右。一旦它给了我,几秒钟后,它进入另一个循环,并开始检索更高分辨率的图像,如960 * 640或左右,这就是冻结发生。我不知道为什么会发生这种情况,但它确实发生了。
对这两个问题的任何投入都将受到高度赞赏。

hl0ma9xz

hl0ma9xz1#

出于某种原因它做了两次工作
因为这是它应该做的。从照片库中获取图像需要时间,正如您所发现的。因此,默认行为是我们尽可能快地提供低分辨率图像,这样您就可以显示一些内容;然后,我们会再次调用,可能是多次,并使用质量更好的图像版本。此外,获取是异步形成的。因此,完全有可能一次发生多个获取请求,这可能会导致代码开始绊倒自己的脚,正如您所发现的。
如果你不喜欢这样,可以把fetch选项synchronous设置为true--但是你必须在后台队列中进行整个调用!通过在一个 serial 队列中这样做,你可以确保调用是依次单独执行的,并且每个图像只被传递一次。此外,然后(也只有这样)你的PHImageRequestOptions.DeliveryModeFastFormat才会被执行。不要忘记在处理你收到的图像之前回到主线程!

fivyi3re

fivyi3re2#

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

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
        }
    }
}

相关问题