美文网首页
iOS 获取相册照片逻辑

iOS 获取相册照片逻辑

作者: percivals | 来源:发表于2021-03-19 14:54 被阅读0次

    总结一下之前做项目的时候自定义系统相册的一些知识点,比较简单,涉及获取系统相册照片集合,读取照片内容等

    框架介绍 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];
    
    • 相册类型PHAssetCollectionType,不同的类型有不同的内容,最好相册和智能相册都要进行获取,否则会遗漏内容
      一般会剔除掉“最近删除”和“最近添加”,微信也是这样做的
     PHAssetCollectionTypeAlbum      = 1,  相册,系统外的
     PHAssetCollectionTypeSmartAlbum = 2,  智能相册,系统自己分配和归纳的
     PHAssetCollectionTypeMoment     = 3,  时刻,系统自动通过时间和地点生成的分组
    
    • 详细类型 PHAssetCollectionSubtype
      内容太多,不一一列举

    • 相册标题

    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 图片的质量来压缩图片,只生效一次 尽可能保留图片清晰度,图片不会明显模糊

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

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

    相关文章

      网友评论

          本文标题:iOS 获取相册照片逻辑

          本文链接:https://www.haomeiwen.com/subject/jomwgktx.html