美文网首页
简易图片选择器

简易图片选择器

作者: yahibo | 来源:发表于2019-05-22 17:47 被阅读0次

    主要使用PhotoKit框架包含了与photos相关的文件。一下为常用的几个类:

    1、PHPhotoLibrary

    phphotolibrary提供对用户照片库中照片、视频和相关内容的元数据和图像数据的访问,包括来自相机卷、iCloud共享、照片流、导入和从iTunes同步的内容。
    获取当前的访问权限有一下方法:

    + (PHAuthorizationStatus)authorizationStatus;
    + (void)requestAuthorization:(void(^)(PHAuthorizationStatus status))handler;
    

    参数说明:
    PHAuthorizationStatusNotDetermined
    用户尚未对此应用程序做出选择。
    PHAuthorizationStatusRestricted
    此应用程序无权访问照片数据。用户无法更改此应用程序的状态,可能是由于存在活动限制(如家长控制)所致。
    PHAuthorizationStatusDenied
    用户已明确拒绝此应用程序访问照片数据。
    PHAuthorizationStatusAuthorized
    用户已授权此应用程序访问照片数据。

    权限枚举代码如下:

    typedef NS_ENUM(NSInteger, PHAuthorizationStatus) {
        PHAuthorizationStatusNotDetermined = 0, //用户尚未对此应用程序做出选择
        PHAuthorizationStatusRestricted,        //此应用程序无权访问照片数据。用户无法更改此应用程序的状态,可能是由于存在活动限制(如家长控制)所致。
                                                
        PHAuthorizationStatusDenied,            //用户已明确拒绝此应用程序访问照片数据。
        PHAuthorizationStatusAuthorized         //用户已授权此应用程序访问照片数据。
    } PHOTOS_AVAILABLE_IOS_TVOS_OSX(8_0, 10_0, 10_13);
    

    2、PHAssetCollection

    继承于PHCollection,获取相册列表方法如下:

    //获取提供的单个类型和子类型的资产集合(使用phassetcollectionsubtypeany匹配所有子类型)
    + (PHFetchResult<PHAssetCollection *> *)fetchAssetCollectionsWithType:(PHAssetCollectionType)type subtype:(PHAssetCollectionSubtype)subtype options:(nullable PHFetchOptions *)options;
    

    参数含义
    type相册类型:

    typedef NS_ENUM(NSInteger, PHAssetCollectionType) {
        PHAssetCollectionTypeAlbum      = 1,//相册
        PHAssetCollectionTypeSmartAlbum = 2,//智能相册
        PHAssetCollectionTypeMoment     = 3,//根据时刻和地点分组
    } PHOTOS_ENUM_AVAILABLE_IOS_TVOS(8_0, 10_0);
    

    subtype照片视频类别:

    typedef NS_ENUM(NSInteger, PHAssetCollectionSubtype) {
            //PHAssetCollectionTypeAlbum regular subtypes
            PHAssetCollectionSubtypeAlbumRegular         = 2, //在相册 应用中创建的相簿
            PHAssetCollectionSubtypeAlbumSyncedEvent     = 3, //从iPhone中同步到设备的 事件
            PHAssetCollectionSubtypeAlbumSyncedFaces     = 4, //从iPhone中同步到设备的 面孔(人物)
            PHAssetCollectionSubtypeAlbumSyncedAlbum     = 5, //从iPhone中同步到设备的相簿
            PHAssetCollectionSubtypeAlbumImported        = 6, //从相机或者外部存储设备中导入的相簿
            //PHAssetCollectionTypeAlbum shared subtypes
            PHAssetCollectionSubtypeAlbumMyPhotoStream   = 100, //用户自己的iCloud照片流
            PHAssetCollectionSubtypeAlbumCloudShared     = 101, //一个iCloud共享照片流
            //PHAssetCollectionTypeSmartAlbum subtypes
            PHAssetCollectionSubtypeSmartAlbumGeneric    = 200, //没有指定子类型的智能相簿
            PHAssetCollectionSubtypeSmartAlbumPanoramas  = 201, //所有全景照片的智能相簿——全景照片
            PHAssetCollectionSubtypeSmartAlbumVideos     = 202, //所有视频的智能相簿——视频
            PHAssetCollectionSubtypeSmartAlbumFavorites  = 203, //照片库中所有用户标记为喜欢的资源的智能相簿——个人收藏
            PHAssetCollectionSubtypeSmartAlbumTimelapses = 204, //照片库中所有延时视频的智能相簿——慢动作
            PHAssetCollectionSubtypeSmartAlbumAllHidden  = 205, //所有从 时刻中隐藏的资源的智能相簿
            PHAssetCollectionSubtypeSmartAlbumRecentlyAdded = 206, //所有最近添加到图片库的资源的智能相簿
            PHAssetCollectionSubtypeSmartAlbumBursts     = 207, //连拍快照照片
            PHAssetCollectionSubtypeSmartAlbumSlomoVideos = 208, //应用中所有慢动作视频的智能相簿
            PHAssetCollectionSubtypeSmartAlbumUserLibrary = 209, //所有照片
            PHAssetCollectionSubtypeSmartAlbumSelfPortraits PHOTOS_AVAILABLE_IOS_TVOS(9_0, 10_0) = 210, //包含了所有使用前置摄像头拍摄的资源的智能相册——自拍
            PHAssetCollectionSubtypeSmartAlbumScreenshots PHOTOS_AVAILABLE_IOS_TVOS(9_0, 10_0) = 211, //包含了所有使用屏幕截图的资源的智能相册——屏幕快照
            PHAssetCollectionSubtypeSmartAlbumDepthEffect PHOTOS_AVAILABLE_IOS_TVOS(10_2, 10_1) = 212, //包含了所有兼容设备上使用景深效果拍摄的资源的智能相册
            PHAssetCollectionSubtypeSmartAlbumLivePhotos PHOTOS_AVAILABLE_IOS_TVOS(10_3, 10_2) = 213, //包含了所有Live Photo的智能相册——Live Photo
            //Used for fetching, if you don't care about the exact subtype
            PHAssetCollectionSubtypeAny = NSIntegerMax //所有可能的子类型
        } PHOTOS_ENUM_AVAILABLE_IOS_TVOS(8_0, 10_0);
    

    3、PHFetchResult

    PHFetchResult相册管理的类,photo实体对象的容器,包含通过给定的检索条件返回的asset相册列表。

    4、PHAsset

    该对象为一张照片的实体,可处理可见照片,并且能获取到照片的经纬度、创建时间。

    //媒体类型-展示时需要判断当前资源是图片、视频还是音频
    @property (nonatomic, assign, readonly) PHAssetMediaType mediaType;
    typedef NS_ENUM(NSInteger, PHAssetMediaType) {
        PHAssetMediaTypeUnknown = 0,  //未知
        PHAssetMediaTypeImage   = 1,  //图片
        PHAssetMediaTypeVideo   = 2,  //视频
        PHAssetMediaTypeAudio   = 3,  //音频
    } PHOTOS_ENUM_AVAILABLE_IOS_TVOS(8_0, 10_0);
    //媒体具体类型-图片字类型和视频子类型
    @property (nonatomic, assign, readonly) PHAssetMediaSubtype mediaSubtypes;
    typedef NS_OPTIONS(NSUInteger, PHAssetMediaSubtype) {
        PHAssetMediaSubtypeNone               = 0,    //未知
        
        //Photo subtypes
        PHAssetMediaSubtypePhotoPanorama      = (1UL << 0),    //全景图
        PHAssetMediaSubtypePhotoHDR           = (1UL << 1),    //高清图
        PHAssetMediaSubtypePhotoScreenshot PHOTOS_AVAILABLE_IOS_TVOS(9_0, 10_0) = (1UL << 2),    //屏幕快照
        PHAssetMediaSubtypePhotoLive PHOTOS_AVAILABLE_IOS_TVOS(9_1, 10_0) = (1UL << 3),    //直播
        PHAssetMediaSubtypePhotoDepthEffect PHOTOS_AVAILABLE_IOS_TVOS(10_2, 10_1) = (1UL << 4),    //深度效应
    
        //Video subtypes
        PHAssetMediaSubtypeVideoStreamed      = (1UL << 16),    //视频流
        PHAssetMediaSubtypeVideoHighFrameRate = (1UL << 17),    //高速帧率
        PHAssetMediaSubtypeVideoTimelapse     = (1UL << 18),    //时间推移
    } PHOTOS_AVAILABLE_IOS_TVOS(8_0, 10_0);
    
    //像素宽高
    @property (nonatomic, assign, readonly) NSUInteger pixelWidth;
    @property (nonatomic, assign, readonly) NSUInteger pixelHeight;
    //创建时间、修改时间
    @property (nonatomic, strong, readonly, nullable) NSDate *creationDate;
    @property (nonatomic, strong, readonly, nullable) NSDate *modificationDate;
    //经纬度
    @property (nonatomic, strong, readonly, nullable) CLLocation *location;
    //持续时间
    @property (nonatomic, assign, readonly) NSTimeInterval duration;
    //通过PHAssetCollection获取PHFetchResult<PHAsset *> *,获取到PHAsset之后就可以得到图片了
    + (PHFetchResult<PHAsset *> *)fetchAssetsInAssetCollection:(PHAssetCollection *)assetCollection options:(nullable PHFetchOptions *)options;
    

    5、PHImageManager

    获取图片

    //图片配置信息
    PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
    options.synchronous = NO;//同步获得图片,只会返回1张图片 只返回一个结果,阻塞直到可用(或失败)。默认为否
    
    //通过PHAsset,加上你需要展示的图片大小、图片类型(是否裁剪等)和PHImageRequestOptions去获取图片
    - (PHImageRequestID)requestImageForAsset:(PHAsset *)asset targetSize:(CGSize)targetSize contentMode:(PHImageContentMode)contentMode options:(nullable PHImageRequestOptions *)options resultHandler:(void (^)(UIImage *__nullable result, NSDictionary *__nullable info))resultHandler;
    
    //这个就是调用的方法获取图片
    [[PHImageManager defaultManager] requestImageForAsset:self.asset targetSize:CGSizeMake(imageWidth * [UIScreen mainScreen].scale, imageWidth * [UIScreen mainScreen].scale) contentMode:PHImageContentModeDefault options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
        NSLog(@"获取的图片:%@", result);
    }];
    

    6、PHImageRequestOptions

    请求选项设置

    //自定义设置图片的大小
    @property (nonatomic, assign) PHImageRequestOptionsResizeMode resizeMode;
    
    typedef NS_ENUM(NSInteger, PHImageRequestOptionsResizeMode) {
        PHImageRequestOptionsResizeModeNone = 0, //保持原size(不调整大小)
        PHImageRequestOptionsResizeModeFast, //高效、但不保证图片的size为自定义size(由系统去安排,情况不定:有时你设置的size比较小,会根据你设的size,有时又会比大)
        PHImageRequestOptionsResizeModeExact, //严格按照自定义size
    } PHOTOS_ENUM_AVAILABLE_IOS_TVOS(8_0, 10_0);
    
    //指定请求是否同步执行。默认异步
    @property (nonatomic, assign, getter=isSynchronous) BOOL synchronous;
    
    //用于对原始尺寸的图像进行裁剪,基于比例坐标。只在 resizeMode 为 Exact 时有效。
    @property (nonatomic, assign) CGRect normalizedCropRect;
    
    //图像质量。有三种值:Opportunistic平衡速度与质量;HighQualityFormat消耗性能获取高质量图像;FastFormat以最快速度提供好的质量。 属性在 synchronous 为 true 时有效。
    @property (nonatomic, assign) PHImageRequestOptionsDeliveryMode deliveryMode;
    
    

    有以上六个类即可从相册中获取图片。如需编辑还设计其他类别,待摸索。应用如下:
    获取相册:

    -(void)getAllCollection{
        if (_collectionList.count==0) {
            //获取相机胶卷
            PHFetchResult<PHAssetCollection *> *cameraRolls = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil];
            //获取个人收藏相册
            PHFetchResult<PHAssetCollection *> *favoritesCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumFavorites options:nil];
            //获取所有自定义相册
            PHFetchResult<PHAssetCollection *> *customCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
            
            for (PHAssetCollection *collection in cameraRolls) {
                HBAlbumModel *model = [[HBAlbumModel alloc] init];
                model.collection = collection;
                model.maxCount = _maxCount==0?9:_maxCount;
                if (model.number>0) {
                    [_collectionList addObject:model];
                }
            }
            for (PHAssetCollection *collection in favoritesCollections) {
                HBAlbumModel *model = [[HBAlbumModel alloc] init];
                model.collection = collection;
                model.maxCount = _maxCount==0?9:_maxCount;
                if (model.number>0) {
                    [_collectionList addObject:model];
                }
            }
            for (PHAssetCollection *collection in customCollections) {
                HBAlbumModel *model = [[HBAlbumModel alloc] init];
                model.collection = collection;
                model.maxCount = _maxCount==0?9:_maxCount;
                if (model.number>0) {
                    [_collectionList addObject:model];
                }
            }
        }
    }
    

    获取相册中的所有PHAsset对象:

    assetList = [PHAsset fetchAssetsInAssetCollection:collection options:nil];
    

    获取图片信息:

    +(void)getPhotoInfoWithAsset:(PHAsset*)asset targetSize:(CGSize)targetSize result:(void(^)(UIImage *image,PHAssetMediaType mediaType))block{
        PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
        options.synchronous = NO;//同步获得图片,只返回一张图片,阻塞直到可用(或失败)。默认为否
        [[PHCachingImageManager defaultManager] requestImageForAsset:asset targetSize:targetSize contentMode:PHImageContentModeDefault options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
            block(result,asset.mediaType);
        }];
    }
    

    参考:https://gitee.com/yahibo/HBPhotoPicker.git

    相关文章

      网友评论

          本文标题:简易图片选择器

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