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];
                }
            });
    }];

获取相册内容

  1. 获取手机相册集合信息 (手机相册内有多个相册,比如最近添加,最近删除,获取相册集合,及每个相册下的图片信息等)
// 所有智能相册  经由相机得来的相册
    PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
// 相册  包含从iTunes 同步来的相册,以及用户在 Photos 中自己建立的相册
    PHFetchResult *customAlbums = [PHAssetCollection fetchAssetCollectionsWithType: PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
 PHAssetCollectionTypeAlbum      = 1,  相册,系统外的
 PHAssetCollectionTypeSmartAlbum = 2,  智能相册,系统自己分配和归纳的
 PHAssetCollectionTypeMoment     = 3,  时刻,系统自动通过时间和地点生成的分组
PHCollection *collection = customAlbums[i];
NSLog(@"相册名称----%@",collection.localizedTitle);
  1. 对相册集合进行遍历,筛选出非空相册
PHFetchResult *fetchResult = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil];

if (fetchResult.count > 0) {
  // 进行下一步操作,获取相册里面的内容
}
  1. 获取相册里面的内容
    相册对象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对象可以获取到对应的元素并进行展示

  1. 获取图片
[[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: 返回一张低清图

*/
  1. 获取视频信息
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  提供可以最快速加载的任何质量的视频
  1. 图片压缩
    两种图片压缩方法:压缩图片质量(Quality),压缩图片尺寸(Size)

压缩图片质量 UIImageJPEGRepresentation 通过 UIImage 和 NSData 的相互转化,减小 JPEG 图片的质量来压缩图片,只生效一次 尽可能保留图片清晰度,图片不会明显模糊

压缩图片尺寸 重绘,可以指定尺寸 清晰度变化较大

可以先压缩图片质量,如果已经小于指定大小,就可得到清晰的图片,否则再压缩图片尺寸

上一篇下一篇

猜你喜欢

热点阅读