iOS開發之 保存圖片到相冊(相機膠捲)

平時開發APP時不免會遇到保存圖片到相冊的相關操做,具體我麼能夠直接保存到系統的相機膠捲,
也能夠自定義相冊保存圖片,下面咱們就一塊兒來看一看.框架

保存圖片到系統相冊

先看看比較簡單的直接保存圖片到系統相冊操做學習

- (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:@"保存失敗"];
        [SVProgressHUD showSuccessWithStatus:@"保存成功"];
    }
}

保存圖片到自定義相冊

  • 之前咱們利用 AssetsLibrary框架 來進行相冊的相關操做,可是AssetsLibrary坑太多,一不當心就是各類警告錯誤,這人很是難受,蘋果彷佛也意識到了問題的嚴重性,因此從iOS8開始搞了個 Photos框架 來給咱們用.fetch

  • iOS已經更新到了9.0, AssetsLibrary 被徹底棄用,下面咱們就用 Photos 來作保存圖片到自定義相冊的操做code

#import <AssetsLibrary/AssetsLibrary.h> // iOS9.0完全棄用,用下面這個吧,拿出來只是提醒你一下
#import <Photos/Photos.h> // iOS8.0開始,咱們最好用這個咯

- (IBAction)save {
    // 0.判斷狀態
    PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
    if (status == PHAuthorizationStatusDenied) {
        BSLog(@"用戶拒絕當前應用訪問相冊,咱們須要提醒用戶打開訪問開關");
    }else if (status == PHAuthorizationStatusRestricted){
        BSLog(@"家長控制,不容許訪問");
    }else if (status == PHAuthorizationStatusNotDetermined){
        BSLog(@"用戶尚未作出選擇");
        [self saveImage];
    }else if (status == PHAuthorizationStatusAuthorized){
        BSLog(@"用戶容許當前應用訪問相冊");
        [self saveImage];
    }
}

/**
 *  返回相冊
 */
- (PHAssetCollection *)collection{
    // 先得到以前建立過的相冊
    PHFetchResult<PHAssetCollection *> *collectionResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
    for (PHAssetCollection *collection in collectionResult) {
        if ([collection.localizedTitle isEqualToString:BSCollectionName]) {
            return collection;
        }
    }
    
    // 若是相冊不存在,就建立新的相冊(文件夾)
    __block NSString *collectionId = nil; // __block修改block外部的變量的值
    // 這個方法會在相冊建立完畢後纔會返回
    [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
        // 新建一個PHAssertCollectionChangeRequest對象, 用來建立一個新的相冊
        collectionId = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:BSCollectionName].placeholderForCreatedAssetCollection.localIdentifier;
    } error:nil];
    
    return [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[collectionId] options:nil].firstObject;
}


/**
 *  返回相冊,避免重複建立相冊引發沒必要要的錯誤
 */
- (void)saveImage{
    /*
     PHAsset : 一個PHAsset對象就表明一個資源文件,好比一張圖片
     PHAssetCollection : 一個PHAssetCollection對象就表明一個相冊
     */
    
    __block NSString *assetId = nil;
    // 1. 存儲圖片到"相機膠捲"
    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ // 這個block裏保存一些"修改"性質的代碼
        // 新建一個PHAssetCreationRequest對象, 保存圖片到"相機膠捲"
        // 返回PHAsset(圖片)的字符串標識
        assetId = [PHAssetCreationRequest creationRequestForAssetFromImage:self.imageView.image].placeholderForCreatedAsset.localIdentifier;
    } completionHandler:^(BOOL success, NSError * _Nullable error) {
        if (error) {
            BSLog(@"保存圖片到相機膠捲中失敗");
            return;
        }
        
        BSLog(@"成功保存圖片到相機膠捲中");
        
        // 2. 得到相冊對象
        PHAssetCollection *collection = [self collection];
        
        // 3. 將「相機膠捲」中的圖片添加到新的相冊
        [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
            PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:collection];
            
            // 根據惟一標示得到相片對象
            PHAsset *asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[assetId] options:nil].firstObject;
            // 添加圖片到相冊中
            [request addAssets:@[asset]];
        } completionHandler:^(BOOL success, NSError * _Nullable error) {
            if (error) {
                BSLog(@"添加圖片到相冊中失敗");
                return;
            }
            
            BSLog(@"成功添加圖片到相冊中");
            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                [SVProgressHUD showSuccessWithStatus:@"保存成功"];
            }];
        }];
    }];
}

代碼比較瑣碎,其實在開發的時候直接將上面代碼拷進項目稍微改一改就能夠了,因此記得收藏哦!!orm

更多關於iOS學習開發的文章請登錄個人我的博客www.zhunjiee.com,歡迎前來參觀學習對象

相關文章
相關標籤/搜索