美文网首页
iOS 保存图片到自定义相册

iOS 保存图片到自定义相册

作者: Mr_Jee | 来源:发表于2020-12-05 10:24 被阅读0次
    项目中为了方便查看保存的图片,需要把图片保存到自定义的相册中,具体代码如下:

    1、先检查相册权限

    - (void)saveImageToAlbumWithName:(NSString *)albumName image:(UIImage *)image {
        //判断授权状态
        PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
        if (status == PHAuthorizationStatusAuthorized) { //已授权
            [self saveImageWithImage:image albumName:albumName];
        } else if (status == PHAuthorizationStatusDenied) { //拒绝
            NSLog(@"请打开访问相册的权限");
        } else if (status == PHAuthorizationStatusNotDetermined) { //未决定
            // 弹框请求用户授权
            [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
                if (status == PHAuthorizationStatusAuthorized) { // 用户点击了好
                    [self saveImageWithImage:image albumName:albumName];
                }
            }];
        } else if (status == PHAuthorizationStatusRestricted) { //家长控制模式限制
            NSLog(@"因为系统原因, 无法访问相册");
        }
    }
    

    2、创建自定义相册

    - (PHAssetCollection *)creatPHAssetWithAlbumName:(NSString *)albumName {
        
        //从已经存在的相簿中查找应用对应的相册
        PHFetchResult<PHAssetCollection *> *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
        for (PHAssetCollection *collection in assetCollections) {
            if ([collection.localizedTitle isEqualToString:albumName]) {
                return collection;
            }
        }
        // 没找到,就创建新的相簿
        NSError *error;
        __block NSString *assetCollectionLocalIdentifier = nil;
        //这里用wait请求,保证创建成功相册后才保存进去
        [[PHPhotoLibrary sharedPhotoLibrary]performChangesAndWait:^{
    
            assetCollectionLocalIdentifier = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:albumName].placeholderForCreatedAssetCollection.localIdentifier;
            
        } error:&error];
        
        if (error) return nil;
        
        return [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[assetCollectionLocalIdentifier] options:nil].lastObject;
    }
    

    3、保存图片

    - (void)saveImageWithImage:(UIImage *)image albumName:(NSString *)albumName {
        // PHAsset : 一个资源,一个图片
        // PHAssetCollection : 一个相簿 (也可以说是一个相册)
        // PHotoLibrary 整个照片库(里面会有很多相册)
        
        __block NSString *assetLocalIdentifier = nil;
        [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
            
            // 1.保存图片到相机胶卷中
            assetLocalIdentifier = [PHAssetChangeRequest creationRequestForAssetFromImage:image].placeholderForCreatedAsset.localIdentifier;
            
        } completionHandler:^(BOOL success, NSError * _Nullable error) {
            
            if (success == NO || error) {
                dispatch_async(dispatch_get_main_queue(), ^{
                    NSLog(@"保存照片失败");
                });
                return;
            }
            
            // 2. 获得相册
            PHAssetCollection *creatAssetCollction = [self creatPHAssetWithAlbumName:albumName];
            if (creatAssetCollction == nil) {
                dispatch_async(dispatch_get_main_queue(), ^{
                    NSLog(@"创建相册失败");
                });
                return;
            }
            
            //创建成功,就把图片保存到相册中
            [[PHPhotoLibrary sharedPhotoLibrary]performChanges:^{
                
                //添加相机胶卷中的图片到相簿中去
                PHAsset *asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[assetLocalIdentifier] options:nil].lastObject;
                //添加图片到相册中的请求
                PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:creatAssetCollction];
                [request addAssets:@[asset]];
                
            } completionHandler:^(BOOL success, NSError * _Nullable error) {
                
                if (success == NO || error) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                      NSLog("保存图片失败");
                    });
                } else {
                    dispatch_async(dispatch_get_main_queue(), ^{
                      NSLog(@"保存图片成功");
                    });
                }
            }];
            
        }];
    }
    

    相关文章

      网友评论

          本文标题:iOS 保存图片到自定义相册

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