美文网首页一步步学习ios
保存图片到相册中

保存图片到相册中

作者: 冷武橘 | 来源:发表于2020-05-28 16:53 被阅读0次

    一、 C语言函数UIImageWriteToSavedPhotosAlbum

    - (IBAction)save {
        UIImageWriteToSavedPhotosAlbum(self.imageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
    }
    
    - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
    {
        if (error) {
            [SVProgressHUD showErrorWithStatus:@"保存失败!"];
        } else {
            [SVProgressHUD showSuccessWithStatus:@"保存成功!"];
        }
    }
    

    二、Photos

    • 1、PHAsset : 一个PHAsset对象就代表相册中的一张图片或者一个视频。
      查 : [PHAsset fetchAssets...]
      增删改 : PHAssetChangeRequest(包括图片\视频相关的所有改动操作)

    • 2、PHAssetCollection : 一个PHAssetCollection对象就代表一个相册
      查 : [PHAssetCollection fetchAssetCollections...]
      增删改 : PHAssetCollectionChangeRequest(包括相册相关的所有改动操作)

    • 3、 对相片\相册的任何【增删改】操作,都必须放到以下方法的block中执行:
      -[PHPhotoLibrary performChanges:completionHandler:]
      -[PHPhotoLibrary performChangesAndWait:error:]

     #1、异步执行修改操作
     [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
     [PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image];
     } completionHandler:^(BOOL success, NSError * _Nullable error) {
     if (error) {
     [SVProgressHUD showErrorWithStatus:@"保存失败!"];
     } else {
     [SVProgressHUD showSuccessWithStatus:@"保存成功!"];
     }
     }];
    
     #2、同步执行修改操作
     NSError *error = nil;
     [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
     [PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image];
     } error:&error];
     if (error) {
     [SVProgressHUD showErrorWithStatus:@"保存失败!"];
     } else {
     [SVProgressHUD showSuccessWithStatus:@"保存成功!"];
     }
    

    三、请求检查访问权限 :

    • 如果用户还没有做出选择,会自动弹框,用户对弹框做出选择后,才会调用block。
    • 如果之前已经做过选择,会直接执行block。
        [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
            dispatch_async(dispatch_get_main_queue(), ^{
                if (status == PHAuthorizationStatusDenied) { // 用户拒绝当前App访问相册
                    if (oldStatus != PHAuthorizationStatusNotDetermined) {
                        NSLog(@"提醒用户打开开关");
                    }
                } else if (status == PHAuthorizationStatusAuthorized) { // 用户允许当前App访问相册
                    [self saveImageIntoAlbum];
                } else if (status == PHAuthorizationStatusRestricted) { // 无法访问相册
                    [SVProgressHUD showErrorWithStatus:@"因系统原因,无法访问相册!"];
                }
            });
        }];
    

    四、示例

    #pragma mark -     请求\检查访问权限 :
    - (IBAction)save {
        PHAuthorizationStatus oldStatus = [PHPhotoLibrary authorizationStatus];
    
       [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
            dispatch_async(dispatch_get_main_queue(), ^{
                if (status == PHAuthorizationStatusDenied) { // 用户拒绝当前App访问相册
                    if (oldStatus != PHAuthorizationStatusNotDetermined) {
                        NSLog(@"提醒用户打开开关");
                    }
                } else if (status == PHAuthorizationStatusAuthorized) { // 用户允许当前App访问相册
                    [self saveImageIntoAlbum];
                } else if (status == PHAuthorizationStatusRestricted) { // 无法访问相册
                    [SVProgressHUD showErrorWithStatus:@"因系统原因,无法访问相册!"];
                }
            });
        }];
    }
    #pragma mark -   保存图片到相册
    - (void)saveImageIntoAlbum
    {
        // 获得相片
        PHFetchResult<PHAsset *> *createdAssets = self.createdAssets;
        if (createdAssets == nil) {
            [SVProgressHUD showErrorWithStatus:@"保存图片失败!"];
            return;
        }
        
        // 获得相册
        PHAssetCollection *createdCollection = self.createdCollection;
        if (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:@"保存图片成功!"];
        }
    }
    
    - (PHFetchResult<PHAsset *> *)createdAssets
    {
         NSError *error = nil;
        __block NSString *assetID = nil;
        
        // 保存图片到【相机胶卷】
        [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
            assetID = [PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image].placeholderForCreatedAsset.localIdentifier;
        } error:&error];
        
        if (error) return nil;
        
        // 获取刚才保存的相片
        return [PHAsset fetchAssetsWithLocalIdentifiers:@[assetID] options:nil];
    }
    
    #pragma mark - 获得当前App对应的自定义相册
    - (PHAssetCollection *)createdCollection
    {
        // 获得软件名字
        NSString *title = [NSBundle mainBundle].infoDictionary[(__bridge NSString *)kCFBundleNameKey];
        
        // 抓取所有的自定义相册
        PHFetchResult<PHAssetCollection *> *collections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
        
        // 查找当前App对应的自定义相册
        for (PHAssetCollection *collection in collections) {
            if ([collection.localizedTitle isEqualToString:title]) {
                return collection;
            }
        }
        
    #pragma mark - 当前App对应的自定义相册没有被创建过 **/
    #pragma mark - 创建一个【自定义相册】
        NSError *error = nil;
        __block NSString *createdCollectionID = nil;
        [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
            createdCollectionID = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title].placeholderForCreatedAssetCollection.localIdentifier;
        } error:&error];
        
        if (error) return nil;
        
        #pragma mark -  根据唯一标识获得刚才创建的相册
        return [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[createdCollectionID] options:nil].firstObject;
    }
    

    相关文章

      网友评论

        本文标题:保存图片到相册中

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