iOS 获取相册照片逻辑
2021-03-19 本文已影响0人
percivals
总结一下之前做项目的时候自定义系统相册的一些知识点,比较简单,涉及获取系统相册照片集合,读取照片内容等
框架介绍 Photos
常用类: PHPhotoLibrary、PHAsset、PHAssetCollection、PHCollection、PHFetchResult等等
PHPhotoLibrary 管理对用户照片库的访问和更改的共享对象,获取权限
PHAsset 照片库中的图像,视频或Live Photo元素等存储对象
PHAssetCollection 照片资源分组的表示形式
PHCollection 表示1组照片或视频资源
PHFetchResult 获得照片实体的有序列表
准备工作
1.判断有无权限
PHAuthorizationStatus authStatus = [PHPhotoLibrary authorizationStatus];
如果未申请过权限,则进行权限获取
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus selectStatus) {
dispatch_sync(dispatch_get_main_queue(), ^{
if (selectStatus == PHAuthorizationStatusAuthorized) {
[self loadPhotoData];
} else {
[self dismiss];
}
});
}];
获取相册内容
- 获取手机相册集合信息 (手机相册内有多个相册,比如最近添加,最近删除,获取相册集合,及每个相册下的图片信息等)
// 所有智能相册 经由相机得来的相册
PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
// 相册 包含从iTunes 同步来的相册,以及用户在 Photos 中自己建立的相册
PHFetchResult *customAlbums = [PHAssetCollection fetchAssetCollectionsWithType: PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
- 相册类型PHAssetCollectionType,不同的类型有不同的内容,最好相册和智能相册都要进行获取,否则会遗漏内容
一般会剔除掉“最近删除”和“最近添加”,微信也是这样做的
PHAssetCollectionTypeAlbum = 1, 相册,系统外的
PHAssetCollectionTypeSmartAlbum = 2, 智能相册,系统自己分配和归纳的
PHAssetCollectionTypeMoment = 3, 时刻,系统自动通过时间和地点生成的分组
-
详细类型 PHAssetCollectionSubtype
内容太多,不一一列举 -
相册标题
PHCollection *collection = customAlbums[i];
NSLog(@"相册名称----%@",collection.localizedTitle);
- 对相册集合进行遍历,筛选出非空相册
PHFetchResult *fetchResult = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil];
if (fetchResult.count > 0) {
// 进行下一步操作,获取相册里面的内容
}
- 获取相册里面的内容
相册对象PHAssetCollection里面存储元素assets信息
assets里面存放图片、视频等元素的唯一标识符和参数等
- (NSArray *)getAllPhotosAssetInAblumCollection:(PHAssetCollection *)assetCollection ascending:(BOOL)ascending
{
NSMutableArray *assets = [NSMutableArray array];
PHFetchOptions *option = [[PHFetchOptions alloc] init];
PHFetchResult *result = [PHAsset fetchAssetsInAssetCollection:assetCollection options:option];
[result enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL * _Nonnull stop) {
[assets addObject:asset];
}];
return assets;
}
option参数负责筛选符合条件的元素
比如排序方式、元素类型等
// 排序
option.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:ascending]];
// 筛选出图片类型
NSPredicate *media = [NSPredicate predicateWithFormat:@"mediaType == %ld", PHAssetMediaTypeImage];
NSCompoundPredicate *compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[media]];
option.predicate = compoundPredicate;
//查询n天之内的照片
NSDate *date = [NSDate date];
NSDate *lastDate = [date initWithTimeIntervalSinceNow:-3600*24*30];
NSPredicate *predicateDate = [NSPredicate predicateWithFormat:@"creationDate >= %@", lastDate];
NSCompoundPredicate *compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[media, predicateDate]];
option.predicate = compoundPredicate;
获取元素内容
通过相册里面存放的asset对象可以获取到对应的元素并进行展示
- 获取图片
[[PHCachingImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeAspectFill options:option resultHandler:^(UIImage * _Nullable image, NSDictionary * _Nullable info) {
// 获取到图片
}];
其中size为需要获取到的图片尺寸,option为自定义设置项信息,
PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init];
option.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
option.resizeMode = PHImageRequestOptionsResizeModeFast;
根据获取图片是同步还是异步有以下属性配置:
同步只能获取一张高清原图,异步方式可以自己定义配置项
/* PHImageRequestOptionsResizeMode:
1. synchronous = YES. 同步。只返回一张图片并且deliveryMode会忽略用户设置的值,直接设为 PHImageRequestOptionsDeliveryModeHighQualityFormat。
a. resizeMode: PHImageRequestOptionsResizeModeNone: 返回的是原图大小
b. resizeMode: PHImageRequestOptionsResizeModeFast: 当原图是压缩图时,会使用targetSize来最优解码图片,获得的图片大小可能比targetSize大
c. resizeMode: PHImageRequestOptionsResizeModeExact: 解压和Fast一样,但是返回的是指定targetSize的高质量图
2. synchronous: NO. 异步。
a. deliveryMode: PHImageRequestOptionsDeliveryModeOpportunistic: 会返回多张图片
1). PHImageRequestOptionsResizeModeNone: 先返回低清的缩略图,再返回原图大小
2). PHImageRequestOptionsResizeModeFast: 先返回低清的缩略图,再返回的图片如 1-b 一样
3). PHImageRequestOptionsResizeModeExact: 先返回低清的缩略图,再返回的图片如 1-c一样
b. deliveryMode: PHImageRequestOptionsDeliveryModeHighQualityFormat: 只会返回一张高清图片
1). PHImageRequestOptionsResizeModeNone: 如 1-a 一样
2). PHImageRequestOptionsResizeModeFast: 如 1-b 一样
3). PHImageRequestOptionsResizeModeExact: 如 1-c一样
c. deliveryMode: PHImageRequestOptionsDeliveryModeFastFormat: 只会返回一张图片,并且可能是低清图
1). PHImageRequestOptionsResizeModeNone: 返回一张低清图
2). PHImageRequestOptionsResizeModeFast: 返回一张低清图
*/
- 获取视频信息
PHVideoRequestOptions *options = [[PHVideoRequestOptions alloc] init];
options.version = PHImageRequestOptionsVersionCurrent;
options.deliveryMode = PHVideoRequestOptionsDeliveryModeAutomatic;
PHImageManager *manager = [PHImageManager defaultManager];
[manager requestAVAssetForVideo:asset options:options resultHandler:^(AVAsset * _Nullable asset, AVAudioMix * _Nullable audioMix, NSDictionary * _Nullable info) {
AVURLAsset *urlAsset = (AVURLAsset *)asset;
NSURL *url = urlAsset.URL;
// 获取到url,可以进行视频播放
}];
options参数介绍
PHVideoRequestOptionsVersion 要请求的视频版本
PHVideoRequestOptionsDeliveryMode 指定请求的视频质量和传送优先级的模式
// mode
PHVideoRequestOptionsDeliveryModeAutomatic 会根据请求和当前条件自动确定要提供的视频数据质量
PHVideoRequestOptionsDeliveryModeHighQualityFormat 仅提供最高质量的可用视频
PHVideoRequestOptionsDeliveryModeMediumQualityFormat 提供中等质量的视频,除非本地缓存了更高质量的版本
PHVideoRequestOptionsDeliveryModeFastFormat 提供可以最快速加载的任何质量的视频
- 图片压缩
两种图片压缩方法:压缩图片质量(Quality),压缩图片尺寸(Size)
压缩图片质量 UIImageJPEGRepresentation 通过 UIImage 和 NSData 的相互转化,减小 JPEG 图片的质量来压缩图片,只生效一次 尽可能保留图片清晰度,图片不会明显模糊
压缩图片尺寸 重绘,可以指定尺寸 清晰度变化较大
可以先压缩图片质量,如果已经小于指定大小,就可得到清晰的图片,否则再压缩图片尺寸