iOS8之后获取相册照片

作者: 飞不越疯人院 | 来源:发表于2016-03-19 20:24 被阅读1448次

    以前使用ALAssetLibrary获取相册的图片,前几天做图片上传功能.需要获取相册中图片并且可以多选.然后就网上搜索资料查阅了新框架PhotoKit,有一点获取相册图片的心得,

    介绍下 PhotoKit 基本构成:

    (其余的不多介绍了,网上有很多教程,就不献丑了,这篇文章只说如何快速获取到相册图片来展示.)

    PHAsset: 代表照片库中的一个资源(包含一系列参数),跟 ALAsset 类似,通过 PHAsset 可以获取和保存资源;

    PHFetchOptions: 获取资源时的参数,可以传 nil,即使用系统默认值;

    PHAssetCollection: PHCollection 的子类,表示一个相册或者一个时刻,或者是一个「智能相册(系统提供的特定的一系列相册,例如:最近删除,视频列表,收藏等等,如下图所示);

    PHFetchResult: 表示一系列的资源结果集合,也可以是相册的集合,从 PHCollection 的类方法中获得;

    PHImageManager: 用于处理资源的加载,加载图片的过程带有缓存处理,可以通过传入一个 ;

    PHImageRequestOptions 控制资源的输出尺寸等规格;

    PHImageRequestOptions: 如上面所说,控制加载图片时的一系列参数;

    网上有介绍方法获得PHAsset,我们通过

    CGFloat scale = [UIScreen mainScreen].scale;

    CGSize targetSize = CGSizeMake(CGRectGetWidth([UIScreen mainScreen].bounds) * scale, CGRectGetHeight([UIScreen mainScreen].bounds) * scale);

    PHImageRequestOptions *operation = [[[PHImageRequestOptions alloc] init] autorelease];

    ///必要时从iCloud下载

    //  operation.networkAccessAllowed = YES;

    ///return only a single result, blocking until available (or failure). Defaults to NO

    operation.synchronous = YES;

    PHFetchResult *saveAsset = [PHAsset fetchAssetsWithLocalIdentifiers:@[imagePath] options:nil];

    operation.resizeMode = PHImageRequestOptionsResizeModeFast;

    for (id obj in saveAsset) {
    [[PHImageManager defaultManager] requestImageForAsset:obj targetSize:targetSize contentMode:PHImageContentModeDefault options:operation resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {

    //这里的Result就是相册中一个个照片.         info字典中可以获取到每个照片的路径,但是存起来后却不能取出来根据此路径来展示照片.不知道为何,求大神点拨///

          }];
    }

    但是这样获取到UIImage再展示,获取的过程会很慢,50张照片就需要用9s左右.

    这篇文章就是介绍用另一种放来展示图片就是根据PHAsset的一个字符串属性localIdentifier来获取到照片,进而可以自定义多选图片,如下将UIImage的localIdentifier存储起来

    ///获取资源时的参数

    PHFetchOptions *options = [[[PHFetchOptions alloc] init] autorelease];

    options.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];

    ///表示一系列的资源的集合,也可以是相册的集合

    PHFetchResult *assetsFetchResults = [PHAsset fetchAssetsWithOptions:options];

    ///控制加载图片时的一系列的参数

    PHImageRequestOptions *operation = [[[PHImageRequestOptions alloc] init] autorelease];

    operation.synchronous = YES;

    operation.resizeMode = PHImageRequestOptionsResizeModeFast;

    for (id obj in assetsFetchResults) {

    PHAsset *asset = obj;

    if ([asset.localIdentifier isKindOfClass:[NSString class]]) {

    //将UIImage的localIdentifier存储起来

    [picArray addObject:asset.localIdentifier];

        }

    }

    要展示图片时候根据UIImage的localIdentifier将其取出(可以接口第三方展示图片,直接根据数组中UIImage的标志取出来)展示即可,速度很快.

    CGFloat scale = [UIScreen mainScreen].scale;

    CGSize targetSize = CGSizeMake(CGRectGetWidth([UIScreen mainScreen].bounds) * scale, CGRectGetHeight([UIScreen mainScreen].bounds) * scale);

    PHImageRequestOptions *operation = [[[PHImageRequestOptions alloc] init] autorelease];

    ///必要时从iCloud下载

    //  operation.networkAccessAllowed = YES;

    ///return only a single result, blocking until available (or failure). Defaults to NO

    operation.synchronous = YES;

    operation.resizeMode = PHImageRequestOptionsResizeModeFast;

    PHFetchResult *saveAsset = [PHAsset fetchAssetsWithLocalIdentifiers:@[imagePath] options:nil];

    [saveAsset enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

    [[PHImageManager defaultManager] requestImageForAsset:obj targetSize:targetSize contentMode:PHImageContentModeDefault options:operation resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {

    //通过字符串取出照片result,来展示

    }];

    }];

    demo ,提取码ji2w

    由于demo链接失效, 有需要请直接从这里下载http://code4app.com/forum.php?mod=viewthread&tid=12317&page=1#pid634406

    相关文章

      网友评论

        本文标题:iOS8之后获取相册照片

        本文链接:https://www.haomeiwen.com/subject/hsbhlttx.html