美文网首页
iOS获取手机相簿

iOS获取手机相簿

作者: 始白 | 来源:发表于2019-03-28 17:03 被阅读0次

    之前基于AssetsLibrary的框架封装过相册的单选与多选,不过ALAssetLibrary的方法在iOS 9中不被推荐了,现在用新的框架PhotoKit的来替代。
    首先先了解一下photoKit的框架。photoKit的基本构成有:
    1、PHAsset: 代表照片库中的一个资源,跟 ALAsset 类似,通过 PHAsset 可以获取和保存资源
    2、PHFetchOptions: 获取资源时的参数,可以传 nil,即使用系统默认值
    3、PHAssetCollection: PHCollection 的子类,表示一个相册或者一个时刻,或者是一个「智能相册(系统提供的特定的一系列相册,例如:最近删除,视频列表,收藏等等,如下图所示)
    4、PHFetchResult: 表示一系列的资源结果集合,也可以是相册的集合,从 PHCollection 的类方法中获得
    5、PHImageManager: 用于处理资源的加载,加载图片的过程带有缓存处理,可以通过传入一个 PHImageRequestOptions 控制资源的输出尺寸等规格
    PHImageRequestOptions: 如上面所说,控制加载图片时的一系列参数
    6、PHCollectionList,表示一组 PHCollection,它本身也是一个 PHCollection,因此 PHCollection 作为一个集合,可以包含其他集合,这使到 PhotoKit 的组成比 ALAssetLibrary 要复杂一些。另外与 ALAssetLibrary 相似,一个 PHAsset 可以同时属于多个不同的 PHAssetCollection,最常见的例子就是刚刚拍摄的照片,至少同时属于“最近添加”、“相机胶卷”以及“照片 - 精选”这三个 PHAssetCollection.

    PhotoKit结构图

    通过获取手机相簿,可实现相册多选功能

    //用户权限允许后回调
    [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
        if (status == PHAuthorizationStatusAuthorized) {
            /// 用户开通了权限
        }else{
            /// 用户没有开通权限
        }
    }];
    
    ///这里是PHAuthorizationStatus的所有枚举参数
    typedef NS_ENUM(NSInteger, PHAuthorizationStatus) {
        PHAuthorizationStatusNotDetermined = 0, // 用户尚未作出关于这个应用的选择。
        PHAuthorizationStatusRestricted,        // 此应用程序未被授权访问照片数据。
                                                // 用户可能无法更改此应用程序的状态,可能是由于活动限制
                                                // 比如家长控制。
        PHAuthorizationStatusDenied,            // 用户已明确拒绝此应用程序访问照片数据。
        PHAuthorizationStatusAuthorized         // 用户已授权此应用程序访问照片数据。
    }
    /**
     *  获得所有相簿的原图
     */
    - (void)getOriginalImages
    {
        // 获得所有的自定义相簿
        PHFetchResult<PHAssetCollection *> *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
        // 遍历所有的自定义相簿也可以遍历自己需要的相簿
        for (PHAssetCollection *assetCollection in assetCollections) {
            [self enumerateAssetsInAssetCollection:assetCollection original:YES];
        }
        
        // 获得相机胶卷
        PHAssetCollection *cameraRoll = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil].lastObject;
        [self enumerateAssetsInAssetCollection:cameraRoll original:YES];
    }
    /**
     *  获得所有相簿中的缩略图
     */
    - (void)getThumbnailImages
    {
        // 获得所有的自定义相簿
        PHFetchResult<PHAssetCollection *> *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
      /***与上面结果一样
      PHFetchOptions *fetchOptions = [[PHFetchOptions alloc]init];
      PHFetchResult *smartAlbumsFetchResult1 = [PHAssetCollection fetchTopLevelUserCollectionsWithOptions:fetchOptions];
      ***/
        // 遍历所有的自定义相簿也可以遍历自己需要的相簿
        for (PHAssetCollection *assetCollection in assetCollections) {
            if ([assetCollection.localizedTitle isEqualToString:@"微博"]) {
                [self enumerateAssetsInAssetCollection:assetCollection original:NO];
            }
        }
        
        // 获得相机胶卷
        PHAssetCollection *cameraRoll = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil].lastObject;
        [self enumerateAssetsInAssetCollection:cameraRoll original:NO];
    }
    /**
     *  遍历相簿中的所有图片
     *
     *  @param assetCollection 相簿
     *  @param original        是否要原图
     */
    - (void)enumerateAssetsInAssetCollection:(PHAssetCollection *)assetCollection original:(BOOL)original
    {
        NSLog(@"相簿名:%@", assetCollection.localizedTitle);
        
        PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
        // 同步获得图片, 只会返回1张图片
        options.synchronous = YES;
        
        // 获得某个相簿中的所有PHAsset对象
        PHFetchResult<PHAsset *> *assets = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil];
        for (PHAsset *asset in assets) {
            // 是否要原图
            CGSize size = original ? CGSizeMake(asset.pixelWidth, asset.pixelHeight) : CGSizeZero;
            
            // 从asset中获得图片
            [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeDefault options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
                NSLog(@"%@,info%@", result,info);
            }];
        }
    }
    /**
     *  获得相机胶卷中的所有图片
     */
    - (void)getImagesFromCameraRoll
    {
        // 获得相机胶卷中的所有图片
        PHFetchResult<PHAsset *> *assets = [PHAsset fetchAssetsWithOptions:nil];
        
        __block int count = 0;
        
        for (PHAsset *asset in assets) {
            [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:CGSizeMake(asset.pixelWidth, asset.pixelHeight) contentMode:PHImageContentModeDefault options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
                NSLog(@"%@ - %zd", result, count++);
            }];
        }
    }
    

    创建自定义相册,并保存图片到该相册

    //添加图片到相机胶卷相册
    - (PHFetchResult<PHAsset *> *)createdAssets
    {
        __block NSString *createdAssetId = nil;
        
        // 添加图片到【相机胶卷】
        [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
            createdAssetId = [PHAssetChangeRequest creationRequestForAssetFromImage:[UIImage imageNamed:@"640x960-1"]].placeholderForCreatedAsset.localIdentifier;
        } error:nil];
        
        if (createdAssetId == nil) return nil;
        
        // 在保存完毕后取出图片
        return [PHAsset fetchAssetsWithLocalIdentifiers:@[createdAssetId] options:nil];
    }
    //获得自定义相册
    - (PHAssetCollection *)createdCollection
    {
        // 获取软件的名字作为相册的标题
        NSString *title = [NSBundle mainBundle].infoDictionary[(NSString *)kCFBundleNameKey];
        
        // 获得所有的自定义相册
        PHFetchResult<PHAssetCollection *> *collections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
        for (PHAssetCollection *collection in collections) {
            if ([collection.localizedTitle isEqualToString:title]) {
                return collection;
            }
        }
        
        // 代码执行到这里,说明还没有自定义相册
        
        __block NSString *createdCollectionId = nil;
        
        // 创建一个新的相册
        [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
            createdCollectionId = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title].placeholderForCreatedAssetCollection.localIdentifier;
        } error:nil];
        
        if (createdCollectionId == nil) return nil;
        
        // 创建完毕后再取出相册
        return [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[createdCollectionId] options:nil].firstObject;
    }
    //将相机胶卷相册的图片引用到自定义相册
    - (void)saveImageIntoAlbum
    {
        // 执行步骤1 获得相片
        PHFetchResult<PHAsset *> *createdAssets = self.createdAssets;
        
        // 执行步骤2.获得自定义相册
        PHAssetCollection *createdCollection = self.createdCollection;
        
        if (createdAssets == nil || createdCollection == nil) {
            [SVProgressHUD showErrorWithStatus:@"保存失败!"];
            return;
        }
        
        // 将相片添加到相册
        NSError *error = nil;
        [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
            PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:createdCollection];
            [request insertAssets:createdAssets atIndexes:[NSIndexSet indexSetWithIndex:0]];
        } error:&error];
        
        // 保存结果
        if (error) {
            [SVProgressHUD showErrorWithStatus:@"保存失败!"];
        } else {
            [SVProgressHUD showSuccessWithStatus:@"保存成功!"];
        }
    }
    

    推荐:https://www.jianshu.com/p/687157a50426
    https://www.cnblogs.com/cqb-learner/p/5792292.html

    相关文章

      网友评论

          本文标题:iOS获取手机相簿

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