我正在使用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
创建缩略图,但对如何执行此操作非常困惑。
非常感谢任何帮助!
答案 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
。