iOS保存图片到相册

news/2024/7/20 21:32:16 标签: ios, objective-c, xcode

方法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(@"保存图片成功");
    }


http://www.niftyadmin.cn/n/905310.html

相关文章

计算机视觉与遥感实验室(CVRS Lab)

http://cvrs.whu.edu.cn/ 武汉大学计算机视觉与遥感实验室&#xff08;WHU-CVRS Lab&#xff09;由学校高层次引进人才姚剑教授于2012年4月创建成立&#xff0c;目前成员包括1名博士后&#xff0c;20余名博士和硕士研究生&#xff0c;10多名本科生。自从成立至今&#xff0c;CV…

2018-12-25工作记录 空白行===水晶报表

C# 多行文本去掉空白行&#xff0c;空行和重复行 string[] strArraystr.Split(new char[] { \r, \n }, StringSplitOptions.RemoveEmptyEntries); strArray strArray.GroupBy(p > p).Select(p > p.Key).ToArray(); 水晶报表&#xff1a;一般先建立一个数据集&#xff0c…

iOS 显示圆角、阴影和边框

iOS 同时显示圆角(部分)、阴影和边框 在 iOS 开发中&#xff0c;让View显示圆角和阴影以及边框 方法1&#xff1a;系统的UIView UIView *v[[UIView alloc]initWithFrame:CGRectMake(100, 200, viewWidth, viewHeight)];v.backgroundColor[UIColor yellowColor]; // v.layer.m…

Windows上提高工作效率的神器推荐

Everything 下载地址&#xff1a;http://www.voidtools.com/功能&#xff1a;硬盘文件搜索&#xff0c;比起电脑自带的文件搜索&#xff0c;效率提高不是一丁半点。而且Everything还支持正则表达式&#xff0c;小巧而快速&#xff1b;Clover 下载地址&#xff1a;http://cn.eji…

keychain介绍

1. keychain概述 1.1 keychain是什么 苹果官网对钥匙串的描述 iOS keychain 是一个相对独立的空间&#xff0c;是用SQLite进行存储的&#xff0c;可以加密我们保存的数据&#xff0c;并且使用keychain service API增删改查。 keychain的是以item为单位存储的。data是数据本身…

@codeforces - 786E@ ALT

目录 description - translationsolutionpart - 1part - 2part - 3accepted codedetailsdescription - translation 给定一棵含 n 个点的树和 m 个人&#xff0c;第 i 个人会从结点 xi 走到 结点 yi。 每个人有一个需求&#xff1a;要么他开局自带一条狗&#xff0c;要么他走的…

gitLab创建自己的私有库

1.在gitlab上创建私有库 code repository&#xff0c;代码仓库&#xff0c;克隆code repository到本地并添加工程CXTool&#xff0c;上传所有文件到远端的库中并打tag git add . git commit -m 你的修改记录 git remote add origin 代码仓库地址 // 在push之前, 查看spec是否配…

mDNS故障排查(译)

WLC上mDNS网关的理解及排查 第一部分&#xff1a;介绍 这篇文档描述了Bonjour协议在WLC上的操作&#xff0c;该文档旨在协助工程师理解该工作流量的原理以及提供故障排查的指导。 第二部分&#xff1a;需求和前提 知识需求&#xff1a; Cisco建议你对Bonjour协议、在WLC配置mDN…