iOS儲存圖片到新建相簿(iOS Photos)
阿新 • • 發佈:2019-02-15
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(@"儲存圖片到建立的相簿失敗");
}
}];
}];
}