iOS 保存圖片(視頻)到相冊

一、C語言函數方式實現app

注意:UIImageWriteToSavedPhotosAlbum方法必須實現代理方法,不然會崩潰。框架

//參數1:圖片對象
//參數2:成功方法綁定的target
//參數3:成功後調用方法
//參數4:須要傳遞信息(成功後調用方法的參數)
UIImageWriteToSavedPhotosAlbum(self.imageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
#pragma mark -- <保存到相冊>
-(void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
    NSString *msg = nil ;
    if(error){
        msg = @"保存圖片失敗" ;
    }else{
        msg = @"保存圖片成功" ;
    }
}

方法2:使用Photos框架實現異步

2.1 Photos01-基本認識

PHAsset : 一個PHAsset對象就表明相冊中的一張圖片或者一個視頻
PHAssetCollection : 一個PHAssetCollection 對象就表明一個相冊函數

若是咱們想保存圖片到【相機膠捲】,首先要保證添加一個新的PHAsset對象,那麼如何操做這些對象呢?無非是對這些對象進行增刪改查。fetch

PHAsset 一個PHAsset對象就表明相冊中的一張圖片或者一個視頻
增刪改 PHAssetChangeRequest 包括圖片/視頻相關的改動操做spa

[PHAsset fetchAssets...];代理

PHAssetCollection 一個PHAssetCollection 對象就表明一個相冊code

增刪改 PHAssetCollectionChangeRequest 包括相冊相關的全部改動操做orm

[PHAssetCollection fetchAssetCollectionsContainingAsset:...];視頻

2.2 Photos02-保存圖片到相機膠捲
//保存圖片到【相機膠捲】
    /// 異步執行修改操做
    [[PHPhotoLibrary sharedPhotoLibrary]performChanges:^{
        [PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image];
    } completionHandler:^(BOOL success, NSError * _Nullable error) {
        if (error) {
            NSLog(@"%@",@"保存失敗");
        } else {
            NSLog(@"%@",@"保存成功");
        }
    }];

2.3 Photos03-建立新的相冊

NSError *error = nil;
    [[PHPhotoLibrary sharedPhotoLibrary]performChangesAndWait:^{
        //獲取app名字
        
        NSString *title = [NSBundle mainBundle].infoDictionary[(__bridge NSString*)kCFBundleNameKey];
        //建立一個【自定義相冊】
        [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title];
    } error:&error];

2.4 Photos04-查詢相冊

NSString *title = [NSBundle mainBundle].infoDictionary[(__bridge NSString*)kCFBundleNameKey];
    //查詢全部【自定義相冊】
    PHFetchResult<PHAssetCollection *> *collections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
    PHAssetCollection *createCollection = nil;
    for (PHAssetCollection *collection in collections) {
        if ([collection.localizedTitle isEqualToString:title]) {
            createCollection = collection;
            break;
        }
    }
if (createCollection == nil) {
        //當前對應的app相冊沒有被建立
        //建立一個【自定義相冊】
        NSError *error = nil;
        __block NSString *createCollectionID = nil;
        [[PHPhotoLibrary sharedPhotoLibrary]performChangesAndWait:^{
            //建立一個【自定義相冊】
           createCollectionID = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title].placeholderForCreatedAssetCollection.localIdentifier;
        } error:&error];
        createCollection = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[createCollectionID] options:nil].firstObject;
    }
    NSLog(@"%@",createCollection);

2.5 Photos05-保存圖片到自定義相冊

// 1.先保存圖片到【相機膠捲】
    /// 同步執行修改操做
    NSError *error = nil;
    __block PHObjectPlaceholder *placeholder = nil;
    [[PHPhotoLibrary sharedPhotoLibrary]performChangesAndWait:^{
       placeholder =  [PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image].placeholderForCreatedAsset;
    } error:&error];
    if (error) {
        NSLog(@"保存失敗");
        return;
    }
    // 2.擁有一個【自定義相冊】
    PHAssetCollection * assetCollection = self.createCollection;
    if (assetCollection == nil) {
        NSLog(@"建立相冊失敗");
    }
    // 3.將剛纔保存到【相機膠捲】裏面的圖片引用到【自定義相冊】
    [[PHPhotoLibrary sharedPhotoLibrary]performChangesAndWait:^{
        PHAssetCollectionChangeRequest *requtes = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];
        [requtes addAssets:@[placeholder]];
    } error:&error];
    if (error) {
        NSLog(@"保存圖片失敗");
    } else {
        NSLog(@"保存圖片成功");
    }
相關文章
相關標籤/搜索