保存圖片至系統相冊

相冊訪問權限數組

使用系統相冊的時候,首先判斷是否有權限,沒有權限的話,能夠彈出提示框。緩存

PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];  
if (status == PHAuthorizationStatusRestricted ||  
    status == PHAuthorizationStatusDenied) {  
    // 這裏即是無訪問權限  
    //能夠彈出個提示框,叫用戶去設置打開相冊權限
}  else {
    //這裏就是用權限
}

相冊中圖片變化的監聽異步

相冊監聽中的回調方法是在 子線程 中的,所以要改變UI佈局的話,必須回到主線程async

[[PHPhotoLibrary sharedPhotoLibrary] registerChangeObserver:self];    //建立監聽者
[[PHPhotoLibrary sharedPhotoLibrary] unregisterChangeObserver:self];    //移除監聽者

//相冊變化回調  
- (void)photoLibraryDidChange:(PHChange *)changeInstance  
{  

    dispatch_sync(dispatch_get_main_queue(), ^{  
        //修改UI
    });  

}

獲取相冊中的圖片ide

幾個經常使用的類 PHAsset : 表明照片庫中的一個資源,跟 ALAsset 相似,經過 PHAsset 能夠獲取和保存資源。每一個PHAsset就是一張圖片的詳細信息,包括圖片、位置、時間等。佈局

PHFetchOptions : 獲取資源時的參數,能夠傳 nil,即便用系統默認值。fetch

PHFetchResult : 表示一系列的資源集合,也能夠是相冊的集合。spa

PHAssetCollection : 表示一個相冊或者一個時刻,或者是一個智能相冊(系統提供的特定的一系列相冊,例如:最近刪除,視頻列表,收藏等等)。線程

PHImageManager : 用於處理資源的加載,加載圖片的過程帶有緩存處理,能夠經過傳入一個 PHImageRequestOptions 控制資源的輸出尺寸等規格。code

PHImageRequestOptions : 如上面所說,控制加載圖片時的一系列參數。

// 獲取全部資源的集合,並按資源的建立時間排序
PHFetchOptions *options = [[PHFetchOptions alloc] init];
options.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];

//獲取相機膠捲全部圖片
PHFetchResult *assets = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeVideo options:nil];

PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init];

//設置顯示模式
/*
PHImageRequestOptionsResizeModeNone    //選了這個就不會管傳如的size了 ,要本身控制圖片的大小,建議仍是選Fast
PHImageRequestOptionsResizeModeFast    //根據傳入的size,迅速加載大小相匹配(略大於或略小於)的圖像 
PHImageRequestOptionsResizeModeExact    //精確的加載與傳入size相匹配的圖像 
*/
option.resizeMode = PHImageRequestOptionsResizeModeFast;
option.synchronous = NO;
option.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;

CGFloat scale = [UIScreen mainScreen].scale;
CGSize screenSize = [UIScreen mainScreen].bounds.size;

typeof(self)weakSelf = self;
for (PHAsset *asset in assets) {

    [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:CGSizeMake(screenSize.width*scale, screenSize.height*scale) contentMode:PHImageContentModeAspectFit options:option resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
        //我這裏用個模型接儲存了圖片的 localIdentifier 和圖片自己
        //還有不少信息,根據本身的需求來取
        CellModel * model = [CellModel new];
        model.localIdentifier = asset.localIdentifier;
        model.image = [UIImage imageWithData:UIImageJPEGRepresentation(result, 0.5)];

        [weakSelf.cellImageArray addObject:model];

        dispatch_async(dispatch_get_main_queue(), ^{
            [weakSelf reloadData];
        });

    }];

}

將圖片保存到相冊

方法一: 優勢:簡單快捷 缺點:沒法直接保存到自定義相冊

- (IBAction)savePhoto {
    //  - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;
    //只能保存到相機膠捲(不能保存到自定義相冊)
    UIImageWriteToSavedPhotosAlbum(self.Photo.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
}

//回調判斷保存是否成功
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
    if (error) {
        //保存失敗
    }else{
        //保存成功
    }
}

方法二: 優勢:可以保存到任何相冊 缺點:沒有第一種方法簡單

// 添加圖片到本身相冊
 - (void)savePhoto
 {
     [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
         // 1.建立圖片請求類(建立系統相冊中新的圖片)PHAssetCreationRequest
         // 把圖片放在系統相冊
         PHAssetCreationRequest *assetCreationRequest = [PHAssetCreationRequest creationRequestForAssetFromImage:_imageView.image];

         // 2.建立相冊請求類(修改相冊)PHAssetCollectionChangeRequest
         PHAssetCollectionChangeRequest *assetCollectionChangeRequest = nil;

         // 獲取以前相冊
         PHAssetCollection *assetCollection = [self fetchAssetCollection:@"百思不得姐"];

         // 判斷是否已有相冊
         if (assetCollection) {
             // 若是存在已有同名相冊   指定這個相冊,建立相冊請求修改類  
             assetCollectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];
         } else {  //不存在,建立新的相冊
             assetCollectionChangeRequest = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:@"百思不得姐"];
         } 
         // 3.把圖片添加到相冊中
         // NSFastEnumeration:之後只要看到這個,就能夠表示數組
         //assetCreationRequest.placeholderForCreatedAsset 圖片請求類佔位符(至關於一個內存地址) 
          //由於creationRequestForAssetFromImage方法是異步實行的,在這裏不能保證 assetCreationRequest有值

         [assetCollectionChangeRequest addAssets:@[assetCreationRequest.placeholderForCreatedAsset]];

     } completionHandler:^(BOOL success, NSError * _Nullable error) {

         if (success) {
             [SVProgressHUD showSuccessWithStatus:@"保存成功"];
         } else {
             [SVProgressHUD showErrorWithStatus:@"保存失敗"];
         }

     }];
 }

 // 指定相冊名稱,獲取相冊
 - (PHAssetCollection *)fetchAssetCollection:(NSString *)title
 {
     // 獲取相簿中全部自定義相冊
     PHFetchResult *result = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
     遍歷相冊,判斷是否存在同名的相冊
     for (PHAssetCollection *assetCollection in result) {
         if ([title isEqualToString:assetCollection.localizedTitle]) {  存在,就返回這個相冊
             return assetCollection;
         }
     }  
     return nil;
 }
相關文章
相關標籤/搜索