在APP中点击照片,都会显示出大图,然后在大图的上面会有个保存照片的按钮,照片直接保存到了系统的【相机胶卷】相册中,但是因为公司产品的需要,我们需要创建和APP同名的相册保存在【自定义相册】里面,这也就是分应用存储,因为用户可能从QQ,微信,微博分别存储,下次用户想找某个应用的图片,直接点开该应用相册即可,提高用户体验。

注意:

【自定义相册】里面的图片来源于【相机胶卷】相册中,即:【相机胶卷】引用【自定义相册】, 如果用户删掉【相机胶卷】里面的图片, 那么【自定义相册】重的图片也会删掉。但是,如果用户删掉【自定义相册】里面的图片, 那么【相机胶卷】中依然有该图片。

开发步骤:

1.先保存图片到【相机胶卷】(不能直接保存到自定义相册中)

2.拥有一个【自定义相册】

3.将刚才保存到【相机胶卷】里面的图片引用到【自定义相册】

方法1:用C语言函数实现

将图片保存到系统的相册中,只需要下面两句代码就搞定了

//参数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 = @"保存图片成功" ;

}

}

注意:UIImageWriteToSavedPhotosAlbum方法必须实现图1的代理方法,否则会崩溃。

1.png

界面效果如下:界面图

效果图.png

方法2:使用Photos框架实现

2.1 Photos01-基本认识

PHAsset : 一个PHAsset对象就代表相册中的一张图片或者一个视频

PHAssetCollection : 一个PHAssetCollection 对象就代表一个相册

如果我们想保存图片到【相机胶卷】,首先要保证添加一个新的PHAsset对象,那么如何操作这些对象呢?无非是对这些对象进行增删改查。

PHAsset 一个PHAsset对象就代表相册中的一张图片或者一个视频

增删改 PHAssetChangeRequest 包括图片/视频相关的改动操作

查 [PHAsset fetchAssets...];

PHAssetCollection 一个PHAssetCollection 对象就代表一个相册

增删改 PHAssetCollectionChangeRequest 包括相册相关的所有改动操作

查 [PHAssetCollection fetchAssetCollectionsContainingAsset:...];

2.2 Photos02-保存图片到相机胶卷

//保存图片到【相机胶卷】

/// 异步执行修改操作

[[PHPhotoLibrary sharedPhotoLibrary]performChanges:^{

[PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image];

} completionHandler:^(BOOL success, NSError * _Nullable error) {

if (error) {

NSLog(@"%@",@"保存失败");

} else {

NSLog(@"%@",@"保存成功");

}

}];

效果如图2 图3所示

2.png

3.png

Tips:

如果直接使用 [PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image]; 则会出现如下的崩溃信息

reason: 'This method can only be called from inside of -[PHPhotoLibrary performChanges:completionHandler:] or -[PHPhotoLibrary performChangesAndWait:error:]'

结论:凡是涉及增删改的操作,均需要放在performChanges里面执行。

[[PHPhotoLibrary sharedPhotoLibrary]performChanges:^{

// 这里执行操作

} completionHandler:^(BOOL success, NSError * _Nullable error) {

}];

2.3 Photos03-创建新的相册

NSError *error = nil;

[[PHPhotoLibrary sharedPhotoLibrary]performChangesAndWait:^{

//获取app名字

NSString *title = [NSBundle mainBundle].infoDictionary[(__bridge NSString*)kCFBundleNameKey];

//创建一个【自定义相册】

[PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title];

} error:&error];

效果如图4:

4.png

Tips:如果我们一直点击保存图片按钮,则会出现重复创建多个相册的问题:

如图5所示

5.png

接着我们来解决这个问题。

2.4 Photos04-查询相册

NSString *title = [NSBundle mainBundle].infoDictionary[(__bridge NSString*)kCFBundleNameKey];

//查询所有【自定义相册】

PHFetchResult *collections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];

PHAssetCollection *createCollection = nil;

for (PHAssetCollection *collection in collections) {

if ([collection.localizedTitle isEqualToString:title]) {

createCollection = collection;

break;

}

}

if (createCollection == nil) {

//当前对应的app相册没有被创建

//创建一个【自定义相册】

NSError *error = nil;

[[PHPhotoLibrary sharedPhotoLibrary]performChangesAndWait:^{

//创建一个【自定义相册】

[PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title];

} error:&error];

}

输出结果:

此时,无论你点击多少次,均只会创建一个与APP同名的相册。

Tips: 如果我们想把图片保存到【自定义相册】里面的话,必须拿到相册对象,但是细心地你此时可能会发现,如果是第一次创建相册(即:相册中没有与APP同名的相册),createCollection对象会为nil,所以我们还需要优化创建【自定义相册】的代码。

核心代码:

if (createCollection == nil) {

//当前对应的app相册没有被创建

//创建一个【自定义相册】

NSError *error = nil;

__block NSString *createCollectionID = nil;

[[PHPhotoLibrary sharedPhotoLibrary]performChangesAndWait:^{

//创建一个【自定义相册】

createCollectionID = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:title].placeholderForCreatedAssetCollection.localIdentifier;

} error:&error];

createCollection = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[createCollectionID] options:nil].firstObject;

}

NSLog(@"%@",createCollection);

输出结果:

2018-08-12 12:31:59.198751+0800 SavePhotoDemo[971:36240] 7C7FBA58-54AA-4320-9B2A-593BB75428FB/L0/040, title:"SavePhotoDemo", subtitle:"(null)" assetCollectionType=1/2

2.5 Photos05-保存图片到自定义相册

我们创建完相册之后,需要将【相机胶卷】中的图片放到【自定义相册】里面去。

核心代码如下:

// 1.先保存图片到【相机胶卷】

/// 同步执行修改操作

NSError *error = nil;

__block PHObjectPlaceholder *placeholder = nil;

[[PHPhotoLibrary sharedPhotoLibrary]performChangesAndWait:^{

placeholder = [PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image].placeholderForCreatedAsset;

} error:&error];

if (error) {

NSLog(@"保存失败");

return;

}

// 2.拥有一个【自定义相册】

PHAssetCollection * assetCollection = self.createCollection;

if (assetCollection == nil) {

NSLog(@"创建相册失败");

}

// 3.将刚才保存到【相机胶卷】里面的图片引用到【自定义相册】

[[PHPhotoLibrary sharedPhotoLibrary]performChangesAndWait:^{

PHAssetCollectionChangeRequest *requtes = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];

[requtes addAssets:@[placeholder]];

} error:&error];

if (error) {

NSLog(@"保存图片失败");

} else {

NSLog(@"保存图片成功");

}

此时,我们点击保存图片到新建相册~按钮的时候,改图片变被保存到【相机胶卷】和【自定义相册】里面了。

如图6所示

6.png

但是,此时你会发现,每保存新的图片,自定义相册中均会添加到后面,那么如何把每次新添加的图片前置呢?我们发现【相机胶卷】中每次新的图片均会作为封面,系统自带的这个比较智能,如图图7所示

7.png

所以修改添加图片到相册的代码

// 3.将刚才保存到【相机胶卷】里面的图片引用到【自定义相册】

[[PHPhotoLibrary sharedPhotoLibrary]performChangesAndWait:^{

PHAssetCollectionChangeRequest *requtes = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];

[requtes insertAssets:@[placeholder] atIndexes:[NSIndexSet indexSetWithIndex:0]];

} error:&error];

此时,【自定义相册】中新添加的图片便会作为相册的封面了,效果如图8所示。

8.png

ios 保存图片到相册 崩溃_iOS保存图片到相册相关推荐

  1. ios 保存图片到相册 崩溃_iOS保存图片闪退

    问题描述 1.保存图片时调用了 UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)方法 2.个别测试机运行时APP闪退,XCode提示崩溃信息如下 ...

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

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

  3. ios 加载大量图片崩溃_iOS sd_webImage加载大图片时导致内存飙升解决方法

    SDWebImage大家肯定都恨熟悉了,国内外太多的App使用其进行图片加载. 但是最近在使用过程中发现,我用SDWebImage加载多个图片,类似微博动态那种,在加载的过程中.我发现当图片分辨率比较 ...

  4. ios 加载大量图片崩溃_iOS超高分辨率图片崩溃解决方法

    本文为CocoaChina网友xxg90s投稿 前言: ID作为一款以IM为基础的办公软件,在用户使用过程中,经常会遇到一些超大的或者超高分辨率的图片(以下统一称:大图).基于SDWebImage为基 ...

  5. iOS小技能:保存图片到相册( 监听用户的相册授权动作)

    文章目录 引言 I 保存图片 1.1 直接保存图片对象 1.2 保持视图到相册 1.3 视图与保存的图片宽高的关系 II 相册权限处理 2.1 添加权限 2.2 监听第一次授权时,用户点击不允许和允许 ...

  6. 拍照相册和裁剪保存图片集合

    1 写在前面 前两天看了下别人保存图片的方式,又看了郭神的第一行代码的拍照和打开相册,又研究了下对图片的裁剪,然后合在一起做了个demo,以后要用直接用就可以了.先说说这个代码比网上其他的代码好的地方 ...

  7. ios 打印 详细错误日志_iOS中打印系统详细日志

    Q:如何打印当前的函数和行号? A:我们可以在打印时使用一些预编译宏作为打印参数,来打印当前的函数和行号.如: 1 NSLog(@"%s:%d obj=%@", __func__, ...

  8. iOS上传头像, 相册权限,相册权限,拍照上传,相册选择图片,拍照页面语言设置,保存到相册...

    2019独角兽企业重金招聘Python工程师标准>>> 1. 权限 在打开相机拍照或者打开相册选择图片之前, 有必要先判断先是否有权限, 如果没有权限应该给个提示, 让用户自己去设置 ...

  9. iOS判断是否有权限访问相机,相册,定位

    2019独角兽企业重金招聘Python工程师标准>>> iOS判断是否有权限访问相机,相册,定位 原文地址:判断是否有权限访问相机,相册,定位 1.判断用户是否有权限访问相册 #im ...

  10. iOS使用 Metrickit 收集崩溃日志

    iOS使用 Metrickit 收集崩溃日志 Metrickit 是什么 MetricKit 是 苹果在 iOS13系统开始引入的用来汇总和分析有关异常和崩溃诊断以及电源和性能指标的每个设备的报告. ...

最新文章

  1. java中类型转换的造型_Java-类型转换 - 吉胖子很瘦的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. 【视频】vue插值表达式之字符串的反转
  3. 【Python】APScheduler定时任务
  4. 2021年高考成绩查询贵州分数线,2021年贵州省高考分数线
  5. Hadoop 配置文件 启动方式
  6. java html5 上传_HTML5结合ajax实现文件上传以及进度显示
  7. java授权失败_自定义Spring Security的身份验证失败处理方法
  8. noip2013——提高组——花匠(flower)
  9. html中图片连续替换,C# 批量替换html中的图片 示例
  10. 通过Ajax进行POST提交JSON类型的数据到SpringMVC Controller的方法
  11. matlab7.0窗口教程,MATLAB7.0实用教程
  12. (2)香橙派+apache2与php+天猫精灵=自建平台语音支持--香橙派操作系统安装
  13. Hyperscan中的 NFA模型演化
  14. 波形图控件html,[转载]LabVIEW中的波形图(Waveform Chart)详解
  15. 23个无本空手套白狼的赚钱方法!颠…
  16. Excel怎么制作三斜线表头
  17. Bluedroid 函数分析:bta_dm_gattc_register
  18. 【UE5 C++进阶 01】Nanite基础
  19. Go官方包 - strings包
  20. cpu占用高 mongo_记一次 MongoDB 占用 CPU 过高问题的排查

热门文章

  1. Linux挂载报错:Mount is denied because the NTFS volume is already exclusively opened. The volume may be a
  2. [软件人生]耐得住寂寞——积累是低潮时期技术人员的品质
  3. Ubuntu搭建BT服务器FTP服务器发布种子
  4. 2022年(上半年)信息系统项目管理师考试-综合知识真题及解析(一)
  5. 九章量子计算机 知乎,量子计算机《九章》问世 知乎微博消息: 北京时间 12 月 4 日凌晨 3 点,一篇重要文章以 First Releas... - 雪球...
  6. 基于matlab实现双路音频信号的AM调制与解调
  7. selenium怎样定位web提示语
  8. 毕业设计开发日志,基于ARM的嵌入式人脸识别系统的设计与实现
  9. 这内容感觉不咋滴,啊咧怎么就十万+了?
  10. 5分钟图解磁盘结构(软件层面)