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

Posted

技术标签:

【中文标题】如何从 Swift 中的 ALAssetRepresentation 获取低分辨率图像或缩略图【英文标题】:How to get a low res image, or Thumbnail from the ALAssetRepresentation in Swift 【发布时间】:2015-08-24 19:40:58 【问题描述】:

我正在与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】:

这是一个示例(可能存在一些小的编译问题,具体取决于您使用的 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

【讨论】:

漂亮!所以 PhotoKit 是我应该使用的:D 当然。您希望以减小的尺寸加载图像是值得称赞的,CGImageSourceCreateThumbnailAtIndex 是一种很好的方法,但在这种情况下您不必这样做; Photo Kit 会为您处理所有事情。 太棒了。那我就用 PhotoKit,谢谢! + 1 有没有关于如何使用 PhotoKit 枚举用户照片的好材料,你可以指点我吗?这就是我现在所处的位置。 @matt 我想知道比例,意思是 CGImageSourceCreateThumbnailAtIndex 在创建缩略图时会考虑正确的比例吗?比例只有在创建 UIImage 时才重要吗? CGImage 没有比例,@zumzum 只是一个位图。这就是我评论如何获得w的原因

以上是关于如何从 Swift 中的 ALAssetRepresentation 获取低分辨率图像或缩略图的主要内容,如果未能解决你的问题,请参考以下文章

如何从 iOS 中的流中接收数据(swift)

如何从 Swift 中的主线程中关闭

如何从 Swift 4 中的描述中解析数组?

如何从 Swift 3 中的数据中读取属性列表

如何从目标 c 中的 pod 文件访问我的 swift 项目文件?

如何从 Swift 中的 NSURLResponse 中检索 cookie?