//以下代码为APP创建一个单独的相册,并将一张图片存入相册。
#import "ViewController.h"
#import <CoreData/CoreData.h>
#import <Photos/Photos.h> //导入头文件
//相册名
#define kAssetCollectionName @"photoCollection"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIImage * img = [UIImage imageNamed:@"图片名"];//要保存的图片
__block NSString * assetLocalIdentifier = nil;//这个属性用于保存要存储的图片标识。
//系统要求相关操作必须在如下performChanges方法中执行。否则报错。
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
//将图片存入系统相册,并获取图片的标识
assetLocalIdentifier = [PHAssetCreationRequest creationRequestForAssetFromImage:img].placeholderForCreatedAsset.localIdentifier;
} completionHandler:^(BOOL success, NSError * _Nullable error) {
if (!success) {//判断是否保存成功
NSLog(@"%@",error);
return ;
}
PHAssetCollection * assetCollection = [self getAssetCollection];//获取相册
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
//获取图片标识
PHAsset * asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[assetLocalIdentifier] options:nil].lastObject;
//创建修改请求
PHAssetCollectionChangeRequest * request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];
//利用请求把图片加入相册
[request addAssets:@[asset]];
} completionHandler:^(BOOL success, NSError * _Nullable error) {
if (!success) {//判断是否保存成功
NSLog(@"%@",error);
return ;
}
}];
}];
}
/** 判断相册是否已存在,如不存在则创建一个新的 */
- (PHAssetCollection *)getAssetCollection{
//获取系统中类型为PHAssetCollectionTypeAlbum的所有相册
PHFetchResult * fetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
for (PHAssetCollection * assetCollection in fetchResult) {//遍历相册
if ([assetCollection.localizedTitle isEqualToString:kAssetCollectionName]) {//判断相册是否存在
return assetCollection;//如果相册存在(已创建),则返回相册。
}
}//如果判断相册不存在,则自已创建一个相册
__block NSString * assetCollectionLocalIdentifier = nil;//这个属性用来保存相册标识
NSError * error = nil;
[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
//创建一个我们自定义的相册,这也算修改相册,顺便获取相册的标识
assetCollectionLocalIdentifier = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:kAssetCollectionName].placeholderForCreatedAssetCollection.localIdentifier;
} error:&error];
if (error) {//如果相册创建失败
NSLog(@"%@",error);
return nil;
}
//返回相册
return [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[assetCollectionLocalIdentifier] options:nil].lastObject;
}
@end
****************************以下代码用于从相册中获取图片(只可选一张图片)*******************************************
@interface ViewController ()<UIImagePickerControllerDelegate,UINavigationControllerDelegate>//需要遵守协议
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//如果相册无法打开则直接返回
if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) return;
UIImagePickerController * pickerController = [[UIImagePickerController alloc] init];
pickerController.delegate = self;
pickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;//打开照片应用,根据返回类型不同,可打开不同相册
[self presentViewController:pickerController animated:YES completion:nil];
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
UIImage * image = info[UIImagePickerControllerOriginalImage];//拿到图片
[picker dismissViewControllerAnimated:YES completion:nil];//退出控制器。
}
*********下面方法可获取到相机图片库中所有图片**********************
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
PHFetchResult<PHAsset *> * fetchResult = [PHAsset fetchAssetsWithOptions:nil];
for (PHAsset * asset in fetchResult) {
//参数二targetSize表示返回图片时,图片的尺寸。例子中是要求返回100宽高的图片。如果我们用CGSizeMake(asset.pixelWidth,asset.pixelWidth)则系统将返回缩略图和原图两份图片。前面一半为缩略图,后面一半为原图。
[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:CGSizeMake(100, 100) contentMode:PHImageContentModeDefault options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
}];
}
}
*****************以下代码可以获取所有相册,并拿到每个相册中的图片**********************************
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
PHFetchResult * assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];//获取所有的相册,根据type不同,能拿到不同相册,或只拿某些相册
for (PHAssetCollection * assetCollection in assetCollections) {//从某个相册中取出所有图片
PHFetchResult * assets = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil];
for (PHAsset * asset in assets) {
[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:CGSizeMake(asset.pixelWidth, asset.pixelHeight) contentMode:PHImageContentModeDefault options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
NSLog(@"%@",result);//这里从block的返回值中拿到图片
}];
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结