如何从Swift中的ALAssetRepresentation获取低分辨率图像或缩略图

时间:2015-08-24 19:40:58

标签: ios swift alassetslibrary

我正在使用ALAssetLibrary从我的相机胶卷中获取图像,以获得我正在制作的自定义视图。这样做非常简单:

library.enumerateGroupsWithTypes(ALAssetsGroupType(ALAssetsGroupSavedPhotos), usingBlock: {
        (group: ALAssetsGroup?, stop: UnsafeMutablePointer<ObjCBool>) in
        if group != nil {
            group!.setAssetsFilter(ALAssetsFilter.allPhotos())
            var indexSet = NSIndexSet(indexesInRange: NSMakeRange(0, group!.numberOfAssets() - 1))
            group!.enumerateAssetsAtIndexes(indexSet, options: nil, usingBlock: {
                (result: ALAsset!, index: Int, stop: UnsafeMutablePointer<ObjCBool>) in
                if (result != nil) {
                    var alAssetRapresentation: ALAssetRepresentation = result.defaultRepresentation()
                    var url = alAssetRapresentation.url()
                    var iRef = alAssetRapresentation.fullResolutionImage().takeUnretainedValue()
                    var image = UIImage(CGImage: iRef)
                }
            })
        }
        }) { (NSError) -> Void in
    }

所有这些在模拟器中都很有效。但是在设备上,获得fullResolutionImage()证明是设备上存储器密集的方式并导致崩溃。我认为这很有意义,所有加载到内存中的数十个高分辨率图像都是一个糟糕的想法,因此我想要缩小质量并仅显示图像的缩略图。唯一的问题是,我找不到从AlAssetRepresentation获取缩略图的简单方法。

我正在尝试使用CGImageSourceCreateThumbnailAtIndex创建缩略图,但对如何执行此操作非常困惑。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:4)

以下是一个示例(可能会有一些小的编译问题,具体取决于您使用的Swift版本):

let src = CGImageSourceCreateWithURL(url, nil)
let scale = UIScreen.mainScreen().scale
let w = // desired display width, multiplied by scale
let d : [NSObject:AnyObject] = [
    kCGImageSourceShouldAllowFloat : true,
    kCGImageSourceCreateThumbnailWithTransform : true,
    kCGImageSourceCreateThumbnailFromImageAlways : true,
    kCGImageSourceThumbnailMaxPixelSize : w
]
let imref = CGImageSourceCreateThumbnailAtIndex(src, 0, d)
let im = UIImage(CGImage: imref, scale: scale, orientation: .Up)!

但请注意,您不应再使用ALAssetsLibrary。它在iOS 9中已弃用。切换到Photo Kit,欢迎来到现代世界!现在,您可以拨打PHImageManager.defaultManager().requestImageForAsset,这样您就可以为所需图片提供targetSize