保存图片到【相机胶卷】和【自定义相册】
2016-12-29 10:13
781 查看
一、保存图片到【相机胶卷】
方法一:C语言函数
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { UIImageWriteToSavedPhotosAlbum(self.img, self, @selector(image:didFinishSavingWithError:contextInfo:), nil); } - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo { if (error) { NSLog(@"保存失败"); } else { NSLog(@"保存成功"); } }
方法二:AssetsLibrary 框架
作为一套老框架,AssetsLibrary 不但有坑,而且还不少。比如,AssetsLibrary 实例需要强引用,遵循写入优先原则…现在已经被 Photos 框架代替,这里就不做介绍。方法三:Photos 框架 —— #import <Photos/Photos.h>
// 异步执行修改操作 // 在这里保存图片到相册 [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ [PHAssetChangeRequest creationRequestForAssetFromImage:self.img]; } completionHandler:^(BOOL success, NSError * _Nullable error) { if (error) { NSLog(@"保存失败"); } else { NSLog(@"保存成功"); } }];
// 同步执行修改操作 NSError *error = nil; [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{ [PHAssetChangeRequest creationRequestForAssetFromImage:self.img]; } error:&error]; if (error) { NSLog(@"保存失败"); } else { NSLog(@"保存成功"); }
二、保存图片到【自定义相册】
Photos 框架基本方法概况
PHAsset:一个 PHAsset 对象就代表相册中的一张图片或者视频查:[PHAsset fetchAssets…]
增删改:[PHAssetChangeRequest creation…/delete…]
PHAssetCollection:一个 PHAssetCollection 代表一个相册
查:[PHAssetCollection fetchAssetCollections…]
增删改:[PHAssetCollectionChangeRequest creation…/delete…]
方法步骤
0.判断相册权限PHAuthorizationStatus oldStatus = [PHPhotoLibrary authorizationStatus]; // 如果用户还没有做出选择,会自动弹框,用户对弹框做出选择后,才会调用block // 如果之前已经做过选择,会直接执行block [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { // block中是在子线程中进行,如果刷新UI需要回到主线程 dispatch_async(dispatch_get_main_queue(), ^{ if (status == PHAuthorizationStatusDenied) { NSLog(@"用户拒绝当前APP访问相册"); // 如果状态不等于没有做决定 if (oldStatus != PHAuthorizationStatusNotDetermined) { NSLog(@"提醒用户打开开关"); } } else if (status == PHAuthorizationStatusAuthorized) { NSLog(@"用户允许当前APP访问相册"); } else if (status == PHAuthorizationStatusRestricted) { NSLog(@"无法访问相册"); } }); }];
1.保存图片到【相机胶卷】
NSError *error = nil; __block NSString *assetID = nil; // 图片的ID [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{ assetID = [PHAssetChangeRequest creationRequestForAssetFromImage:image].placeholderForCreatedAsset.localIdentifier; } error:&error]; if (error) { NSLog(@"MYPhotoTool - 保存失败"); }
2.拥有一个【自定义相册】
// 获取软件名字 NSString *title = [NSBundle mainBundle].infoDictionary[(NSString *)kCFBundleNameKey]; // 获取所有自定义相册 PHFetchResult<PHAssetCollection *> *collections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil]; // 查找当前APP对应的自定义相册 for (PHAssetCollection *collection in collections) { // *** 如果存在自定义相册 if ([collection.localizedTitle isEqualToString:collectionName]) { return collection; } } // *** 自定义相册没有被创建过 __block NSString *ID = nil; NSError *error = nil; [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{ // 创建一个【自定义相册】 PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:collectionName]; // 获取站位标识 ID = request.placeholderForCreatedAssetCollection.localIdentifier; } error:&error]; if (error) { NSLog(@"MYPhotoTool - 创建自定义相册失败"); return nil; } // 根据站位标识获取当前APP对应的自定义相册 PHAssetCollection *collection = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[ID] options:nil].firstObject;
3.添加刚才保存的图片到【自定义相册】
NSError *error = nil; [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{ PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:collection]; id<NSFastEnumeration> assetIDs = [PHAsset fetchAssetsWithLocalIdentifiers:@[assetID] ae2d options:nil]; [request insertAssets:assetIDs atIndexes:[NSIndexSet indexSetWithIndex:0]]; } error:&error]; if (error) { NSLog(@"MYPhotoTool - 保存失败"); }
三、选择照片到项目中
1.从相册中选择照片
UIImagePickerController(自带选择界面)(只能选择单张图片)UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; picker.delegate = self; // <UINavigationControllerDelegate, UIImagePickerControllerDelegate> [self presentViewController:picker animated:YES completion:nil];
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info { [picker dismissViewControllerAnimated:YES completion:nil]; self.imgView.image = info[UIImagePickerControllerOriginalImage]; }
AssetsLibrary 框架
Photos 框架
网上基于 Photos 框架的三方框架一搜一大堆,就不浪费时间造轮子了。其实是最近项目太紧了,没时间弄,等年后抽时间把这部分补充一下吧。
2.选择相机拍摄的照片
UIImagePickerController(自带选择界面)和从相册中选择照片一样,改变 sourceType 就可以了
AVCaptureSession ——
#import <AVFoundation/AVFoundation.h>
保存图片到【相机胶卷】和【自定义相册】框架和 DEMO 已经上传到 github ,下载地址:MYPhotoTool
相关文章推荐
- iOS8开发之 PHAsset 保存图片到相册(相机胶卷) 详解二
- iOS8开发之 PHAsset 保存图片到相册(相机胶卷) 详解三
- iOS8开发之 PHAsset 保存图片到相册(相机胶卷) 详解一
- iOS--相机(自定义相机) 保存照片到相册
- 【移动开发】Android相机、相册获取图片显示并保存到SD卡
- 保存(获取)图片到(自定义)相册
- 打开相机,并返回没有被压缩的图片,并且将图片保存在相册中
- android中跳转相册,相机获取图片后截取图片并保存SDCARD
- 保存图片到自定义相册文件夹中,实现处理相册被用户误删的情况
- Android相机、相册获取图片显示并保存到SD卡
- Android调用手机相机和相册拿到图片保存上传
- Android 自定义相机保存图片
- Android相机、相册获取图片显示并保存到SD卡
- 保存(获取)图片到(自定义)相册
- iOS 开发: 自定义相册, 保存多张图片到自定义相册中
- Android相机、相册获取图片显示并保存到SD卡
- Android 代码片段---从相册或相机获取图片保存并处理
- 将相机/相册的图片保存到本地沙盒
- iOS获取相册/相机图片-------自定义获取图片小控件
- Unity for iOS 打开相册、相机及保存图片到相册