1. 程式人生 > >iOS儲存圖片到新建相簿(iOS Photos)

iOS儲存圖片到新建相簿(iOS Photos)

1.直接儲存圖片相簿中(不需要自己建立新的相簿)

- (void)saveImage2Photo:(UIImage *)img {
    
    UIImageWriteToSavedPhotosAlbum(img, self, @selector(image:didFinishSavingWithError:contextInfo:),nil);
}

- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
    if (error == nil) {
        NSLog(@"儲存成功");
    }

}

2.儲存圖片到自己建立相簿中

有點複雜。。。這裡不進行一些文字的概述,跟分析,直接上程式碼。

沒經驗的需要理解一些原理可參考以下兩篇文章:

四步驟進行:

1.授權判斷

2.建立圖片的請求(儲存圖片到相機膠捲中)

5.建立相簿請求

4.將剛剛新增到"相機膠捲"中的圖片到"自己建立相簿"中請求

定一個全域性的相簿名字

//定義一個全域性變數的相簿名字
static NSString *photoAssetCollectionName = @"loukitphoto";

判斷是否有許可權訪問相簿

//判斷是否有許可權訪問相簿
-(void)phAuthorizationCheck{
    /*
     PHAuthorizationStatusNotDetermined,     使用者還沒有做出選擇
     PHAuthorizationStatusDenied,            使用者拒絕當前應用訪問相簿(使用者當初點選了"不允許")
     PHAuthorizationStatusAuthorized         使用者允許當前應用訪問相簿(使用者當初點選了"好")
     PHAuthorizationStatusRestricted,        因為家長控制, 導致應用無法方法相簿(跟使用者的選擇沒有關係)
     */
    
    // 判斷授權狀態
    PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
    if (status == PHAuthorizationStatusRestricted) {
        NSLog(@"無法訪問相簿--PHAuthorizationStatusRestricted");
    } else if (status == PHAuthorizationStatusDenied) {
        NSLog(@"無法訪問相簿--PHAuthorizationStatusDenied");
    } else if (status == PHAuthorizationStatusAuthorized) {
        NSLog(@"可以訪問相簿--PHAuthorizationStatusAuthorized");
        [self saveImage];
    } else if (status == PHAuthorizationStatusNotDetermined) {
        // 彈框請求使用者授權
        NSLog(@"第一次訪問--PHAuthorizationStatusNotDetermined");
        [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
            if (status == PHAuthorizationStatusAuthorized) { // 使用者點選了好
                [self saveImage];
            }
        }];
    }
}
獲取相簿(沒有就建立,有就用)
//  獲得相簿
-(PHAssetCollection *)createAssetCollection{
    
    //判斷是否已存在
    PHFetchResult<PHAssetCollection *> *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
    for (PHAssetCollection * assetCollection in assetCollections) {
        if ([assetCollection.localizedTitle isEqualToString:photoAssetCollectionName]) {
            //說明已經有哪物件了
            return assetCollection;
        }
    }
    
    //建立新的相簿
    __block NSString *assetCollectionLocalIdentifier = nil;
    NSError *error = nil;
    //同步方法
    [[PHPhotoLibrary sharedPhotoLibrary]performChangesAndWait:^{
        // 建立相簿的請求
        assetCollectionLocalIdentifier = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:photoAssetCollectionName].placeholderForCreatedAssetCollection.localIdentifier;
    } error:&error];
    
    if (error)return nil;
    
    return [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[assetCollectionLocalIdentifier] options:nil].lastObject;
}
儲存圖片
//儲存圖片
-(void)saveImage{
    
    __block  NSString *assetLocalIdentifier;
    [[PHPhotoLibrary sharedPhotoLibrary]performChanges:^{
        
        //1.儲存圖片到相機膠捲中----建立圖片的請求
        assetLocalIdentifier = [PHAssetCreationRequest creationRequestForAssetFromImage:self.imageView.image].placeholderForCreatedAsset.localIdentifier;
    } completionHandler:^(BOOL success, NSError * _Nullable error) {
        if(success == NO){
            NSLog(@"儲存圖片失敗----(建立圖片的請求)");
            return ;
        }
        
        // 2.獲得相簿
        PHAssetCollection *createdAssetCollection = [self createAssetCollection];
        if (createdAssetCollection == nil) {
            NSLog(@"儲存圖片成功----(建立相簿失敗!)");
            return;
        }
        
        // 3.將剛剛新增到"相機膠捲"中的圖片到"自己建立相簿"中
        [[PHPhotoLibrary sharedPhotoLibrary]performChanges:^{
            
            //獲得圖片
            PHAsset *asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[assetLocalIdentifier] options:nil].lastObject;
            //新增圖片到相簿中的請求
            PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:createdAssetCollection];
            // 新增圖片到相簿
            [request addAssets:@[asset]];
        } completionHandler:^(BOOL success, NSError * _Nullable error) {
            if(success){
                NSLog(@"儲存圖片到建立的相簿成功");
            }else{
                NSLog(@"儲存圖片到建立的相簿失敗");
            }
        }];
    }];
}