保存到相册步骤:

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-保存图片到(自定义)相册步骤相关推荐

  1. iOS - 保存图片至系统相册

    背景 本文而言,保存图片至相册功能相信基本上在开发中都能遇到,但是你在保存你原图大小至系统相册时,系统会主动的进行你图片的缩放和拉伸来适应它图片的展示,好吧,你老大,按你的来,当你按照它屏幕大小设置图 ...

  2. iOS保存图片到相册

    方法1:用C语言函数UIImageWriteToSavedPhotosAlbum实现 //参数1:图片对象 //参数2:成功方法绑定的target //参数3:成功后调用方法 //参数4:需要传递信息 ...

  3. ios 保存图片到相册 崩溃_iOS开发之 保存图片到相册(相机胶卷)

    平时开发APP时难免会遇到保存图片到相册的相关操作,具体我么可以直接保存到系统的相机胶卷, 也可以自定义相册保存图片,下面我们就一起来看一看. 保存图片到系统相册 先看看比较简单的直接保存图片到系统相 ...

  4. c语言保存图片image,iOS 保存图片到【自定义相册】

    3.1.Photos 框架基本认识,我们可以在 Help->Developer Documentation-> 选择OC或者Swift 搜索 Photos Photos 框架检索 Phot ...

  5. 视频聊天源码,IOS 保存图片、视频到自定义相簿

    视频聊天源码,IOS 保存图片.视频到自定义相簿实现的相关代码 1.检测相簿以及创建相簿: /** 创建自定义相册 */ +(void)isExistFolder:(NSString * _Nonnu ...

  6. iOS分段选择器、旅行App、标度尺、对对碰小游戏、自定义相册等源码

    iOS精选源码 企业级开源项目,模仿艺龙旅行App 标签选择器--LeeTagView CSSegmentedControl常用的分段选择器,简单易用! 仿微信左滑删除 IOS左滑返回 输入框 iOS ...

  7. iOS 保存图片(视频)到相册

    1.C语言函数方式实现 注意:UIImageWriteToSavedPhotosAlbum方法必须实现代理方法,否则会崩溃. //参数1:图片对象 //参数2:成功方法绑定的target //参数3: ...

  8. IOS 保存图片、视频到自定义相簿

    网上有很多文章介绍了保存的图片和视频的到相簿的,几经对比和测试,效果都不如人意.经过实测和取长补短,现将重构后的参考实例粘贴如下,仅供学习和参考: 1.检测相簿以及创建相簿: /** 创建自定义相册 ...

  9. iOS中怎么存储照片到自定义相册 转载备份

    原文地址:https://www.cnblogs.com/muzichenyu/p/6006856.html 在市场上主流App中,大多数App都具有存储图片到自己App的相册中.苹果提供的方法只能存 ...

最新文章

  1. 三十四、深入Vue.js语法(中篇)
  2. 数据仓库事实表分类[转]
  3. GCC-__attribute__()(一)属性机制
  4. 获得当前字符串的宽度
  5. ML《决策树(一)ID3》
  6. 从服务器请求文件流工具类,SpringBoot我想获取图片流,然后将图片流的数据传到服务器上...
  7. java窗体输入数据怎么存,java编程之计算矩阵对角线和(从对话窗体输入数据)...
  8. java中Token验证
  9. java image to base64_Java实现base64图片编码数据转换为本地图片的方法
  10. 数据库开发基础-教案-3-认识数据库备份和事务日志备份
  11. 解决centos7 ssh连接慢的问题
  12. Oracle诊断案例-Sql_trace之一
  13. C#反射(Reflection)对类的属性get或set值
  14. ThinkPHP5.1 子查询-使用 Group 获取每组最新数据
  15. hash冲突(碰撞)及解决方法
  16. word文档打对勾_word文档怎么打勾 word文档方框内打勾六种方法介绍
  17. 处理Zabbix历史数据库办法二---使用MySQL表分区
  18. Kyro - To register this class use: kryo.register
  19. UBTC在2019,潮水褪去后的价值凸显
  20. Oracle数据库 - 1

热门文章

  1. NumPy、TensorFlow和scikit-learn简介
  2. 统一操作系统 UOS 龙芯版上线
  3. 三角函数和复指数函数的转化_三角函数与复数
  4. python字符串相加_谁说python字符串相加效率低
  5. php 判断html5,html5触摸事件判断滑动方向的实现
  6. Serlizable序列化接口
  7. python画五角星代码_Python第八课 绘制五角星1.0
  8. 编写java判断闰年_编写java程序判断闰年。
  9. 不同分辨率图片匹配_超实用的图像超分辨率重建方法及应用介绍
  10. python如何确定拐点_如何确认均线拐点的实战技巧和理论(图解)