获取系统相册的所有照片

首先在iOS8.0之前苹果是使用 AssetsLibrary这套框架来获取和操作系统的相册的,然而在iOS8.0之后,苹果大大推出了 PhotoKit ,PhotoKit 是一套比 AssetsLibrary 更完整也更高效的库,对资源的处理跟 AssetsLibrary 也有很大的不同,可以观察照片库的变化和创建提交自己修改的改变。由于iOS现在都是iOS10了,所以本文只介绍iOS8.0后的photoKit。


首先简单介绍几个概念:
  • PHAsset: 代表照片库中的一个资源,跟 ALAsset 类似,通过 PHAsset 可以获取和保存资源
  • PHFetchOptions: 获取资源时的参数,可以传 nil,即使用系统默认值
  • PHFetchResult: 表示一系列的资源集合,也可以是相册的集合
  • PHAssetCollection: 表示一个相册或者一个时刻,或者是一个「智能相册(系统提供的特定的一系列相册,例如:最近删除,视频列表,收藏等等)
  • PHImageManager: 用于处理资源的加载,加载图片的过程带有缓存处理,可以通过传入一个 PHImageRequestOptions 控制资源的输出尺寸等规格
  • PHImageRequestOptions: 如上面所说,控制加载图片时的一系列参数

获取和操作图片的基本操作主要使用上面类的步骤是PHFetchResult(获取资源集合) --> PHFetchOptions (设置获取资源时的对应参数) --> PHAssetCollection (特定的一个相册资源) --> 获取相册里的所有图片的PHAsset对象 --> 根据PHAsset获取图片信息 接下来就直接用代码块来解释如何获取和处理图片吧

iOS 8.0 以上获取所有照片用Photos.h这个库
#pragma mark -- iOS 8.0 以上获取所有照片用Photos.h这个库
-(NSMutableArray*)GetALLphotosUsingPohotKit
{
    NSMutableArray *arr = [NSMutableArray array];
    // 所有智能相册
    PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
    
    for (NSInteger i = 0; i < smartAlbums.count; i++) {
        // 是否按创建时间排序
        PHFetchOptions *option = [[PHFetchOptions alloc] init];
        option.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];
        option.predicate = [NSPredicate predicateWithFormat:@"mediaType == %ld", PHAssetMediaTypeImage];
        PHCollection *collection = smartAlbums[i];
        //遍历获取相册
        if ([collection isKindOfClass:[PHAssetCollection class]]) {
            if ([collection.localizedTitle isEqualToString:@"相机胶卷"]) {
                PHAssetCollection *assetCollection = (PHAssetCollection *)collection;
                PHFetchResult *fetchResult = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil];
                NSArray *assets;
                if (fetchResult.count > 0) {
                    // 某个相册里面的所有PHAsset对象
                    assets = [self getAllPhotosAssetInAblumCollection:assetCollection ascending:YES ];
                    [arr addObjectsFromArray:assets];   
                }
            }
        }
    }    
    //返回相机胶卷内的所有照片
    return arr;
}
获取相册里的所有图片的PHAsset对象
#pragma mark - <  获取相册里的所有图片的PHAsset对象  >
- (NSArray *)getAllPhotosAssetInAblumCollection:(PHAssetCollection *)assetCollection ascending:(BOOL)ascending
{
    // 存放所有图片对象
    NSMutableArray *assets = [NSMutableArray array];
    
    // 是否按创建时间排序
    PHFetchOptions *option = [[PHFetchOptions alloc] init];
    option.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:ascending]];
    option.predicate = [NSPredicate predicateWithFormat:@"mediaType == %ld", PHAssetMediaTypeImage];
    
    // 获取所有图片对象
    PHFetchResult *result = [PHAsset fetchAssetsInAssetCollection:assetCollection options:option];
    // 遍历
    [result enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL * _Nonnull stop) {
        [assets addObject:asset];
    }];
    return assets;
}
根据PHAsset获取图片信息
#pragma mark - <  根据PHAsset获取图片信息  >
- (void)accessToImageAccordingToTheAsset:(PHAsset *)asset size:(CGSize)size resizeMode:(PHImageRequestOptionsResizeMode)resizeMode completion:(void(^)(UIImage *image,NSDictionary *info))completion
{
    static PHImageRequestID requestID = -2;
    
    CGFloat scale = [UIScreen mainScreen].scale;
    CGFloat width = MIN([UIScreen mainScreen].bounds.size.width, 500);
    if (requestID >= 1 && size.width / width == scale) {
        [[PHCachingImageManager defaultManager] cancelImageRequest:requestID];
    }
    PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init];
    option.deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic;
//    option.resizeMode = PHImageRequestOptionsResizeModeFast;
    option.resizeMode = resizeMode;
    
    requestID = [[PHCachingImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeAspectFill options:option resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
        dispatch_async(dispatch_get_main_queue(), ^{
            completion(result,info);
        });
    }];

}
扩展

本文相当于一个获取和操作系统相册的基本流程,其中方法的细节并未深入介绍,如读者需要深入了解可进一步扩展photoKit详解上photoKit详解下
ps:如果对您有帮助请给个赞,万分感谢。

推荐阅读更多精彩内容

  • 本文转载自Kayo Lee发表的文章,本文链接:http://kayosite.com/ios-developme...
    JackyHeWei阅读 7,842评论 10 9
  • 相册适配 前言 由于在iOS8及以后苹果将原有的操作相册的ALAssetsLibrary framework替换为...
    wentianen阅读 1,081评论 0 5
  • 惊蛰起暮雨,文塔连云横。未闻仓庚鸣,众卉春心盟。
    龙山樵子阅读 78评论 0 4
  • 2017年3月20日 星期一 晴天 阴霾多日终于迎来晴天,太阳晒在身上暖融融的。我脱掉了厚厚的毛绒绒的外套,鞋子...
    南薰迹阅读 38评论 5 5
  • 在舍友的推荐下看了这部电影,棒得简直难以形容,比昨天看的《西游伏妖篇》高出不知多少个档次。 7个好朋友聚在一起吃晚...
    星零溡空阅读 35评论 0 0