方法1:用C语言函数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 = @"保存图片成功" ;
}
}
注意:使用该函数必须实现image:didFinishSavingWithError:contextInfo:代理方法,否则会崩溃。
方法2:使用PHPhotos框架实现
2.1 基本认识
PHAsset : 一个PHAsset对象就代表相册中的一张图片或者一个视频
PHAssetCollection : 一个PHAssetCollection 对象就代表一个相册
包括图片/视频相关的改动操作
[PHAsset PHAssetChangeRequest :];
查
[PHAsset fetchAssets...];
包括相册相关的所有改动操作
[PHAssetCollection PHAssetCollectionChangeRequest :];
查
[PHAssetCollection fetchAssetCollectionsContainingAsset:...];
注意:改动操作必须在performChanges:或者performChangesAndWait:的block中执行
//异步执行
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
// 这里执行改动操作
} completionHandler:^(BOOL success, NSError * _Nullable error) {
if (error) {
NSLog(@"%@",@"保存失败");
} else {
NSLog(@"%@",@"保存成功");
}
}];
//同步执行
[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
// 这里执行改动操作
} error:&error];
if (error) {
NSLog(@"%@",@"保存失败");
} else {
NSLog(@"%@",@"保存成功");
}
如果直接使用 [PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image]; 则会出现崩溃
2.2 保存图片到相机胶卷+获取相片
//保存图片到【相机胶卷】
// 异步执行修改操作
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
} completionHandler:^(BOOL success, NSError * _Nullable error) {
if (error) {
NSLog(@"%@",@"保存失败");
} else {
NSLog(@"%@",@"保存成功");
}
}];
// 同步执行修改操作
NSError *error = nil;
__block NSString *assertId = nil;
// 保存图片到【相机胶卷】
[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
//不接收返回参数
[PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image];
//接收返回参数
assertId = [PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image].placeholderForCreatedAsset.localIdentifier;
} error:&error];
if (error) {
NSLog(@"保存失败");
return nil;
}
// 获取相片
PHFetchResult<PHAsset *> *createdAssets = [PHAsset fetchAssetsWithLocalIdentifiers:@[assertId] options:nil];
2.3 创建新的相册+获取相册
【自定义相册】里面的图片来源于【相机胶卷】相册中,即:【相机胶卷】引用【自定义相册】,。
如果用户删掉【相机胶卷】里面的图片, 那么【自定义相册】重的图片也会删掉。
如果用户删掉【自定义相册】里面的图片, 那么【相机胶卷】中依然有该图片。
步骤:
a.先保存图片到【相机胶卷】(不能直接保存到自定义相册中)
b.拥有一个【自定义相册】
c.将刚才保存到【相机胶卷】里面的图片引用到【自定义相册】
//当前对应的app相册没有被创建
NSError *error = nil;
__block NSString *createCollectionID = nil;
[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
//创建一个【自定义相册】(需要这个block执行完,相册才创建成功)
//获取app名字
NSString *title = [NSBundle mainBundle].infoDictionary[(__bridge NSString*)kCFBundleNameKey];
//创建一个【自定义相册】,不接收返回值
//[PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title];
//创建一个【自定义相册】,接收返回值
createCollectionID = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title].placeholderForCreatedAssetCollection.localIdentifier;
} error:&error];
if (error) {
NSLog(@"创建相册失败");
return nil;
}
// 根据唯一标识,获得刚才创建的相册
PHAssetCollection *createCollection = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[createCollectionID] options:nil].firstObject;
2.4 保存图片到自定义相册
我们创建完相册之后,需要将【相机胶卷】中的图片放到【自定义相册】里面去。
核心代码如下:
// 1.先保存图片到【相机胶卷】并获取图片
PHFetchResult<PHAsset *> *createdAssets = self.createdAssets;
if (createdAssets == nil) {
NSLog(@"保存图片失败");
}
// 2.拥有一个【自定义相册】并获取相册
PHAssetCollection * assetCollection = self.createCollection;
if (assetCollection == nil) {
NSLog(@"创建相册失败");
}
// 3.将刚才保存到【相机胶卷】里面的图片引用到【自定义相册】
NSError *error = nil;
[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
PHAssetCollectionChangeRequest *requtes = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];
// [requtes addAssets:@[placeholder]];
[requtes insertAssets:createdAssets atIndexes:[NSIndexSet indexSetWithIndex:0]];
} error:&error];
if (error) {
NSLog(@"保存图片失败");
} else {
NSLog(@"保存图片成功");
}