iOS-保存图片到(自定义)相册步骤
保存到相册步骤:
1.保存图片到【相机胶卷】
2.拥有一个【自定义相册】
3.将刚才保存到【相机胶卷中的图片】引用到【自定义相册】
①保存图片到【相机胶卷】
/*一、保存图片到【自定义相册】1.保存图片到【相机胶卷】1> C语言函数UIImageWriteToSavedPhotosAlbum2> AssetsLibrary框架3> Photos框架2.拥有一个【自定义相册】1> AssetsLibrary框架2> Photos框架3.添加刚才保存的图片到【自定义相册】1> AssetsLibrary框架2> Photos框架*/ - (IBAction)save:(UIButton *)sender {/*保存到相册步骤:1.保存图片到【相机胶卷】2.拥有一个【自定义相册】3.将刚才保存到【相机胶卷中的图片】引用到【自定义相册】*/UIImageWriteToSavedPhotosAlbum(self.imageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil); } - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {if (error) {[SVProgressHUD showErrorWithStatus:@"保存失败!"];} else {[SVProgressHUD showSuccessWithStatus:@"保存成功!"];} }
/* //补充错误信息:-[NSInvocation setArgument:atIndex:]: index (2) out of bounds [-1, 1]错误解释:参数越界错误,方法的参数个数和实际传递的参数个数不一致*/
Photos框架详解和保存图片
1.Photos框架详解
/* 二、Photos框架须知1.PHAsset : 一个PHAsset对象就代表相册中的一张图片或者一个视频1> 查 : [PHAsset fetchAssets...]2> 增删改 : PHAssetChangeRequest(包括图片\视频相关的所有改动操作)2.PHAssetCollection : 一个PHAssetCollection对象就代表一个相册1> 查 : [PHAssetCollection fetchAssetCollections...]2> 增删改 : PHAssetCollectionChangeRequest(包括相册相关的所有改动操作)3.对相片\相册的任何【增删改】操作,都必须放到以下方法的block中执行-[PHPhotoLibrary performChanges:completionHandler:]-[PHPhotoLibrary performChangesAndWait:error:]*//*Foundation和Core Foundation的数据类型可以互相转换,比如NSString *和CFStringRefNSString *string = (__bridge NSString *)kCFBundleNameKey;CFStringRef string = (__bridge CFStringRef)@"test";获得相机胶卷相册[PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil]*//*错误信息:This method can only be called from inside of -[PHPhotoLibrary performChanges:completionHandler:] or -[PHPhotoLibrary performChangesAndWait:error:] // 异步执行修改操作[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{[PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image];} completionHandler:^(BOOL success, NSError * _Nullable error) {if (error) {[SVProgressHUD showErrorWithStatus:@"保存失败!"];} else {[SVProgressHUD showSuccessWithStatus:@"保存成功!"];}}];// 同步执行修改操作NSError *error = nil;[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{[PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image];} error:&error];if (error) {[SVProgressHUD showErrorWithStatus:@"保存失败!"];} else {[SVProgressHUD showSuccessWithStatus:@"保存成功!"];} */
2.Photos框架保存图片到相机胶卷
- (IBAction)save:(UIButton *)sender {/*保存到相册步骤:1.保存图片到【相机胶卷】2.拥有一个【自定义相册】3.将刚才保存到【相机胶卷中的图片】引用到【自定义相册】*/NSError *error = nil;// 保存图片到【相机胶卷】[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{[PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image];} error:&error];if (error) {[SVProgressHUD showErrorWithStatus:@"保存失败!"];} else {[SVProgressHUD showSuccessWithStatus:@"保存成功!"];} }
②拥有一个【自定义相册】
Foundation和Core Foundation的数据类型可以互相转换,比如NSString *和CFStringRef
NSString *string = (__bridge NSString *)kCFBundleNameKey;
CFStringRef string = (__bridge CFStringRef)@"test";
1.创建一个【自定义相册】
/** 当前App对应的自定义相册 */ - (PHAssetCollection *)createdCollection;- (IBAction)save:(UIButton *)sender {/*保存到相册步骤:1.保存图片到【相机胶卷】2.拥有一个【自定义相册】3.将刚才保存到【相机胶卷中的图片】引用到【自定义相册】*/[self createdCollection]; }#pragma mark - 获得当前App对应的自定义相册 - (PHAssetCollection *)createdCollection {// 获得软件名字NSString *title = [NSBundle mainBundle].infoDictionary[(__bridge NSString *)kCFBundleNameKey];// 抓取所有的自定义相册PHFetchResult<PHAssetCollection *> *collections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];// 查找当前App对应的自定义相册for (PHAssetCollection *collection in collections) {if ([collection.localizedTitle isEqualToString:title]) {return collection;}}/** 当前App对应的自定义相册没有被创建过 **/// 创建一个【自定义相册】NSError *error = nil;__block NSString *createdCollectionID = nil;[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{ createdCollectionID = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title].placeholderForCreatedAssetCollection.localIdentifier;} error:&error];if (error) {[SVProgressHUD showErrorWithStatus:@"创建相册失败!"];return nil;}// 根据唯一标识获得刚才创建的相册return [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[createdCollectionID] options:nil].firstObject; } /*Foundation和Core Foundation的数据类型可以互相转换,比如NSString *和CFStringRefNSString *string = (__bridge NSString *)kCFBundleNameKey;CFStringRef string = (__bridge CFStringRef)@"test";获得相机胶卷相册[PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil]*/
2.获取相册
#pragma mark - 获得当前App对应的自定义相册 // 根据唯一标识获得刚才创建的相册return [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[createdCollectionID] options:nil].firstObject;
3.保存图片到自定义相册
/** 当前App对应的自定义相册 */ - (PHAssetCollection *)createdCollection; /** 返回刚才保存到【相机胶卷】的图片 */ - (PHFetchResult<PHAsset *> *)createdAssets;- (IBAction)save:(UIButton *)sender {PHAuthorizationStatus oldStatus = [PHPhotoLibrary authorizationStatus];// 请求\检查访问权限 :// 如果用户还没有做出选择,会自动弹框,用户对弹框做出选择后,才会调用block// 如果之前已经做过选择,会直接执行block[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {dispatch_async(dispatch_get_main_queue(), ^{if (status == PHAuthorizationStatusDenied) { // 用户拒绝当前App访问相册if (oldStatus != PHAuthorizationStatusNotDetermined) {HKLog(@"提醒用户打开开关")}} else if (status == PHAuthorizationStatusAuthorized) { // 用户允许当前App访问相册 [self saveImageIntoAlbum];} else if (status == PHAuthorizationStatusRestricted) { // 无法访问相册[SVProgressHUD showErrorWithStatus:@"因系统原因,无法访问相册!"];}});}]; }/*** 保存图片到相册*/ - (void)saveImageIntoAlbum {// 获得相片PHFetchResult<PHAsset *> *createdAssets = self.createdAssets;if (createdAssets == nil) {[SVProgressHUD showErrorWithStatus:@"保存图片失败!"];return;}// 获得相册PHAssetCollection *createdCollection = self.createdCollection;if (createdCollection == nil) {[SVProgressHUD showErrorWithStatus:@"创建或者获取相册失败!"];return;}// 添加刚才保存的图片到【自定义相册】NSError *error = nil;[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:createdCollection];[request insertAssets:createdAssets atIndexes:[NSIndexSet indexSetWithIndex:0]];} error:&error];// 最后的判断if (error) {[SVProgressHUD showErrorWithStatus:@"保存图片失败!"];} else {[SVProgressHUD showSuccessWithStatus:@"保存图片成功!"];} }#pragma mark - 获得当前App对应的自定义相册 - (PHAssetCollection *)createdCollection {// 获得软件名字NSString *title = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"];// 抓取所有的自定义相册PHFetchResult<PHAssetCollection *> *collections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];// 查找当前App对应的自定义相册for (PHAssetCollection *collection in collections) {if ([collection.localizedTitle isEqualToString:title]) {return collection;}}/** 当前App对应的自定义相册没有被创建过 **/// 创建一个【自定义相册】NSError *error = nil;__block NSString *createdCollectionID = nil;[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{createdCollectionID = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title].placeholderForCreatedAssetCollection.localIdentifier;} error:&error];if (error) return nil;// 根据唯一标识获得刚才创建的相册return [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[createdCollectionID] options:nil].firstObject; }- (PHFetchResult<PHAsset *> *)createdAssets {NSError *error = nil;__block NSString *assetID = nil;// 保存图片到【相机胶卷】[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{assetID = [PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image].placeholderForCreatedAsset.localIdentifier;} error:&error];if (error) return nil;// 获取刚才保存的相片return [PHAsset fetchAssetsWithLocalIdentifiers:@[assetID] options:nil]; }//补充:不带权限判断 //- (IBAction)save { // NSError *error = nil; // // // 保存图片到【相机胶卷】 // __block PHObjectPlaceholder *placeholder = nil; // [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{ // placeholder = [PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image].placeholderForCreatedAsset; // } error:&error]; // if (error) { // [SVProgressHUD showErrorWithStatus:@"保存图片失败!"]; // return; // } // // // 获得相册 // PHAssetCollection *createdCollection = self.createdCollection; // if (createdCollection == nil) { // [SVProgressHUD showErrorWithStatus:@"创建相册失败!"]; // return; // } // // // 添加刚才保存的图片到【自定义相册】 // [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{ // PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:createdCollection]; // [request insertAssets:@[placeholder] atIndexes:[NSIndexSet indexSetWithIndex:0]]; // } error:&error]; // // // 最后的判断 // if (error) { // [SVProgressHUD showErrorWithStatus:@"保存图片失败!"]; // } else { // [SVProgressHUD showSuccessWithStatus:@"保存图片成功!"]; // } //}
转载于:https://www.cnblogs.com/StevenHuSir/p/SavePhotoAndAlbum.html
iOS-保存图片到(自定义)相册步骤相关推荐
- iOS - 保存图片至系统相册
背景 本文而言,保存图片至相册功能相信基本上在开发中都能遇到,但是你在保存你原图大小至系统相册时,系统会主动的进行你图片的缩放和拉伸来适应它图片的展示,好吧,你老大,按你的来,当你按照它屏幕大小设置图 ...
- iOS保存图片到相册
方法1:用C语言函数UIImageWriteToSavedPhotosAlbum实现 //参数1:图片对象 //参数2:成功方法绑定的target //参数3:成功后调用方法 //参数4:需要传递信息 ...
- ios 保存图片到相册 崩溃_iOS开发之 保存图片到相册(相机胶卷)
平时开发APP时难免会遇到保存图片到相册的相关操作,具体我么可以直接保存到系统的相机胶卷, 也可以自定义相册保存图片,下面我们就一起来看一看. 保存图片到系统相册 先看看比较简单的直接保存图片到系统相 ...
- c语言保存图片image,iOS 保存图片到【自定义相册】
3.1.Photos 框架基本认识,我们可以在 Help->Developer Documentation-> 选择OC或者Swift 搜索 Photos Photos 框架检索 Phot ...
- 视频聊天源码,IOS 保存图片、视频到自定义相簿
视频聊天源码,IOS 保存图片.视频到自定义相簿实现的相关代码 1.检测相簿以及创建相簿: /** 创建自定义相册 */ +(void)isExistFolder:(NSString * _Nonnu ...
- iOS分段选择器、旅行App、标度尺、对对碰小游戏、自定义相册等源码
iOS精选源码 企业级开源项目,模仿艺龙旅行App 标签选择器--LeeTagView CSSegmentedControl常用的分段选择器,简单易用! 仿微信左滑删除 IOS左滑返回 输入框 iOS ...
- iOS 保存图片(视频)到相册
1.C语言函数方式实现 注意:UIImageWriteToSavedPhotosAlbum方法必须实现代理方法,否则会崩溃. //参数1:图片对象 //参数2:成功方法绑定的target //参数3: ...
- IOS 保存图片、视频到自定义相簿
网上有很多文章介绍了保存的图片和视频的到相簿的,几经对比和测试,效果都不如人意.经过实测和取长补短,现将重构后的参考实例粘贴如下,仅供学习和参考: 1.检测相簿以及创建相簿: /** 创建自定义相册 ...
- iOS中怎么存储照片到自定义相册 转载备份
原文地址:https://www.cnblogs.com/muzichenyu/p/6006856.html 在市场上主流App中,大多数App都具有存储图片到自己App的相册中.苹果提供的方法只能存 ...
最新文章
- 三十四、深入Vue.js语法(中篇)
- 数据仓库事实表分类[转]
- GCC-__attribute__()(一)属性机制
- 获得当前字符串的宽度
- ML《决策树(一)ID3》
- 从服务器请求文件流工具类,SpringBoot我想获取图片流,然后将图片流的数据传到服务器上...
- java窗体输入数据怎么存,java编程之计算矩阵对角线和(从对话窗体输入数据)...
- java中Token验证
- java image to base64_Java实现base64图片编码数据转换为本地图片的方法
- 数据库开发基础-教案-3-认识数据库备份和事务日志备份
- 解决centos7 ssh连接慢的问题
- Oracle诊断案例-Sql_trace之一
- C#反射(Reflection)对类的属性get或set值
- ThinkPHP5.1 子查询-使用 Group 获取每组最新数据
- hash冲突(碰撞)及解决方法
- word文档打对勾_word文档怎么打勾 word文档方框内打勾六种方法介绍
- 处理Zabbix历史数据库办法二---使用MySQL表分区
- Kyro - To register this class use: kryo.register
- UBTC在2019,潮水褪去后的价值凸显
- Oracle数据库 - 1
热门文章
- NumPy、TensorFlow和scikit-learn简介
- 统一操作系统 UOS 龙芯版上线
- 三角函数和复指数函数的转化_三角函数与复数
- python字符串相加_谁说python字符串相加效率低
- php 判断html5,html5触摸事件判断滑动方向的实现
- Serlizable序列化接口
- python画五角星代码_Python第八课 绘制五角星1.0
- 编写java判断闰年_编写java程序判断闰年。
- 不同分辨率图片匹配_超实用的图像超分辨率重建方法及应用介绍
- python如何确定拐点_如何确认均线拐点的实战技巧和理论(图解)