利用Photos 框架搭建美图秀秀相册选择器

简介:Photos框架是iOS8.0后推出的一个新的用于对系统相册进行相关操作的,在iOS8.0之前,开发中只能使用AssetsLibrary框架来访问移动设备的图片库。本文中不再对AssetsLibrary做过多的介绍,仅针对Photos框架进行详细介绍。并且以美图秀秀的照片选择器作为实例载体进行功能实现。

首先要获取系统的所有相册,有多个方法可以选择

1.该方法通过唯一标识符identifiers来获取相册  PHFetchOptions为将要获取到了相册的相关属性对象

+ (PHFetchResult<PHAssetCollection *> *)fetchAssetCollectionsWithLocalIdentifiers:(NSArray<NSString *> *)identifiers options:(nullable PHFetchOptions *)options;

2.该方法通过PHAssetCollectionType 相册分类枚举值获取相关相册 PHAssetCollectionSubtype 为子类型 即进一步想相册分类  如Album和 AlbumCoundShared组合表示从iTunes同步来的 并且是从icloud分享来的相册



+ (PHFetchResult<PHAssetCollection *> *)fetchAssetCollectionsWithType:(PHAssetCollectionType)type subtype:(PHAssetCollectionSubtype)subtype options:(nullable PHFetchOptions *)options;
相关枚举值如下
typedef NS_ENUM(NSInteger, PHAssetCollectionType) {
    PHAssetCollectionTypeAlbum      = 1, //从iTunes同步而来的及用户自建的相册
    PHAssetCollectionTypeSmartAlbum = 2,//相机拍摄而成的相册
    PHAssetCollectionTypeMoment     = 3,//Photos为我们自动生成的时间分组相册
}


enum PHAssetCollectionSubtype : Int {
    case AlbumRegular //用户在 Photos 中创建的相册,也就是我所谓的逻辑相册
    case AlbumSyncedEvent //使用 iTunes 从 Photos 照片库或者 iPhoto 照片库同步过来的事件。然而,在iTunes 12 以及iOS 9.0 beta4上,选用该类型没法获取同步的事件相册,而必须使用AlbumSyncedAlbum。
    case AlbumSyncedFaces //使用 iTunes 从 Photos 照片库或者 iPhoto 照片库同步的人物相册。
    case AlbumSyncedAlbum //做了 AlbumSyncedEvent 应该做的事
    case AlbumImported //从相机或是外部存储导入的相册,完全没有这方面的使用经验,没法验证。
    case AlbumMyPhotoStream //用户的 iCloud 照片流
    case AlbumCloudShared //用户使用 iCloud 共享的相册
    case SmartAlbumGeneric //文档解释为非特殊类型的相册,主要包括从 iPhoto 同步过来的相册。由于本人的 iPhoto 已被 Photos 替代,无法验证。不过,在我的 iPad mini 上是无法获取的,而下面类型的相册,尽管没有包含照片或视频,但能够获取到。
    case SmartAlbumPanoramas //相机拍摄的全景照片
    case SmartAlbumVideos //相机拍摄的视频
    case SmartAlbumFavorites //收藏文件夹
    case SmartAlbumTimelapses //延时视频文件夹,同时也会出现在视频文件夹中
    case SmartAlbumAllHidden //包含隐藏照片或视频的文件夹
    case SmartAlbumRecentlyAdded //相机近期拍摄的照片或视频
    case SmartAlbumBursts //连拍模式拍摄的照片,在 iPad mini 上按住快门不放就可以了,但是照片依然没有存放在这个文件夹下,而是在相机相册里。
    case SmartAlbumSlomoVideos //Slomo 是 slow motion 的缩写,高速摄影慢动作解析,在该模式下,iOS 设备以120帧拍摄。不过我的 iPad mini 不支持,没法验证。
    case SmartAlbumUserLibrary //这个命名最神奇了,就是相机相册,所有相机拍摄的照片或视频都会出现在该相册中,而且使用其他应用保存的照片也会出现在这里。
    case Any //包含所有类型
}

3.该方法也是通过相册分类进行查询 用法同上

// Smart Albums are not supported, only Albums and Moments

+ (PHFetchResult<PHAssetCollection *> *)fetchAssetCollectionsContainingAsset:(PHAsset *)asset withType:(PHAssetCollectionType)type options:(nullable PHFetchOptions *)options;

4.该方法通过管理iOS8.0之前的AssetsLibrary的唯一标识URL

+ (PHFetchResult<PHAssetCollection *> *)fetchAssetCollectionsWithALAssetGroupURLs:(NSArray<NSURL *> *)assetGroupURLs options:(nullable PHFetchOptions *)options;

还有几个获取系统相册的方法  用法类似 在此不再描述。

获取相册后,我们需要遍历每一个相册,获取具体的照片内容,下面将介绍几个常用的方法。

首先介绍一下PHFetchResult类,该类实例对象既可以表示一个相册集合,也可以表示具体的照片集合,就像文件夹一样,文件夹下既可以是文件夹,也可以是具体的文件,因此,我们用它来描述以上获取的相册集合,同样也会用它描述具体的照片集合。

当我们通过以上方法获取到相册集合后,应当遍历PHFetchResult对象(类似数组,操作与数组相同,只是存储的数据类型为PHAssetCollection对象),如下获取某一个相册集合下的具体一个相册(具体相册即为照片集合):

  PHFetchResult *result = [PHAsset fetchAssetsInAssetCollection:(PHAssetCollection对象) options:nil];

如下方法进行了某一个具体的相册查询,其中由于当前result为相册对象,因此获取的图片为相册封面照片,targetSize为目标照片的尺寸,该框架会提供一张你指定的尺寸照片,以达到提升性能的目的,如果缺省会返回原尺寸大小的照片(可能会占用较大内存,不建议这样做哦)。PHImageRequestOptions为照片尺寸的拉伸模式。PHImageRequestOptions参数为照片的获取配置,如果需要从iCloud下载图片,可以详细配置,一般使用默认配置即可。回调block中提供了UIImage对象和照片信息字典。

 PHFetchResult *assetResult = [PHAsset fetchAssetsInAssetCollection:collection options:nil];
 [[PHImageManager defaultManager] requestImageForAsset:assetResult.firstObject targetSize:_coverImgView.frame.size contentMode:PHImageContentModeDefault options:[PHImageRequestOptions new] resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {

        _coverImgView.image = result;

    }];

以上即为整体美图照片选择器所使用到的Photos框架基本技术,如下为具体的核心代码。

    /*        相册配置  使用默认即可         */
    PHFetchOptions *fetchOptions = [PHFetchOptions new];

    /*        初始化相册数组         */
    _deviceAlumDataArr = [NSMutableArray array];

    /* 获取系统创建的相册 */
    PHFetchResult *smartAlbumFetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAny options:fetchOptions];
    _allAblubResult = smartAlbumFetchResult;

    /*        遍历系统创建相册结果集         */
    for (PHAssetCollection *sub in smartAlbumFetchResult) {
        PHFetchResult *result = [PHAsset fetchAssetsInAssetCollection:sub options:nil];

        if (result.count==0) {
            continue;
        }

        /*        添加具体相册到相册数组         */
        [_deviceAlumDataArr addObject:sub];

    }

    /*        获取所有的用户创建相册         */
    PHFetchResult *smartAlbumFetchResult2 = [PHAssetCollection fetchTopLevelUserCollectionsWithOptions:nil];

    /*        遍历用户自建相册结果集         */
    for (PHAssetCollection *sub in smartAlbumFetchResult2) {

        PHFetchResult *result = [PHAsset fetchAssetsInAssetCollection:sub options:nil];

        if (result.count==0) {
            continue;
        }
        /*        添加具体相册到相册数组         */
        [_deviceAlumDataArr addObject:sub];

    }
    

效果图如下:如果有朋友需要源码,可以到github上面下载哦,喜欢的话记得start??:https://github.com/China131/JHM_TShow.git

 
时间: 2024-10-24 08:47:12

利用Photos 框架搭建美图秀秀相册选择器的相关文章

iOS开发系列--打造自己的“美图秀秀”

http://www.cnblogs.com/kenshincui/p/3959951.html#overview --绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz 2D绘制2D图形和Core Image中强大的滤镜功能. Quartz 2D 基本图形绘制 视图刷新 其他图形上下文 Core Image Quartz 2D 在iOS中常用的绘图框

打造自己的“美图秀秀”

概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz 2D绘制2D图形和Core Image中强大的滤镜功能. Quartz 2D 在iOS中常用的绘图框架就是Quartz 2D,Quartz 2D是Core Graphics框架的一部分,是一个强大的二维图像绘制引擎.Quartz 2D在UIKit中也有很好的封装和集成,我们日常开发时所用到的UIKit中的组件都是由Cor

强大的Core Image(教你做自己的美图秀秀))

iOS5新特性:强大的Core Image(教你做自己的美图秀秀)) iOS5给我们带来了很多很好很强大的功能和API.Core Image就是其中之一,它使我们很容易就能处理图片的各种效果,色彩啊,曝光啊,饱和度啊,变形啊神马的.可惜苹果一直没能完善官方文档,也没有推出示例代码,所以国内很多同学可能还没有开始使用.但国外的大神们已经证明这是个相当强悍的框架,不仅功能强大,而且可以直接使用GPU,效率奇高,甚至可以实时的对视频进行渲染.下面让我们来看看,如何具体使用它:首先你需要导入 CoreI

Qt Quick 图像处理实例之美图秀秀(附源码下载)

在<Qt Quick 之 QML 与 C++ 混合编程详解>一文中我们讲解了 QML 与 C++ 混合编程的方方面面的内容,这次我们通过一个图像处理应用,再来看一下 QML 与 C++ 混合编程的威力,同时也为诸君揭开美图秀秀.魔拍之类的相片美化应用的底层原理. 项目的创建过程请参考<Qt Quick 之 Hello World 图文详解>,项目名称为 imageProcessor ,创建完成后需要添加两个文件: imageProcessor.h 和 imageProcessor.

美图秀秀web开发文档

Xiuxiu 组件 import React, { Component } from 'react'; class XiuXiu extends Component { componentDidMount() { const {closeModal, imageUrl, uploadUrl, formData} = this.props; /* 第1个参数是加载编辑器div容器,第2个参数是编辑器类型,第3个参数是div容器宽,第4个参数是div容器高*/ xiuxiu.embedSWF('al

美图秀秀 web开发图片编辑器

美图秀秀web开发平台 http://open.web.meitu.com/wiki/ 1.环境配置 1.1.设置crossdomain.xml 下载crossdomain.xml文件,把解压出来的crossdomain.xml文件放在您保存图片或图片来源的服务器根目录下,比如: http://example.com.cn,那么crossdomain.xml的路径为:http://example.com.cn/crossdomain.xml.需要注意的是crossdomain.xml必须部署于站

美图秀秀api实现图片的裁剪及美化

美图秀秀不仅有PC版.手机版等客户端的软件,还有Web开方接口,可以在web页面上调用美图秀秀的api接口,实现图片的编辑.像淘宝.网易.qq空间.新浪微博等大厂都使用过该接口. 官网地址:http://open.web.meitu.com,使用方法也很简单,直接参照官网文档: 第一步:环境配置 下载 crossdomain.xml 文件,然后把 crossdomain.xml 文件放到保存图片的服务器上根目录下,例如您的保存图片的服务器地址为: http://www.example.com,那

美图秀秀-美化图片之【特效】界面设计

本文是特效界面设计,在美图秀秀的特效模块主要是实现图片添加滤镜效果,界面挺炫的. 界面包含黑边和虚化按钮,4种类型的滤镜,每种类型又包含许多具体滤镜效果,当我们点击时候开始处理图片 1.加载图片 self.imageView = [[UIImageView alloc] initWithImage:self.image]; self.imageView.frame = CGRectMake(0, 0, WIDTH, HEIGHT - 130); self.imageView.contentMod

美图秀秀团队新出的短视频应用「美拍」为何这么火?

这个世界有种畅销品叫作“美”它的载体通常是可视化的——图片和视频,美图这个团队从美图秀秀到美拍无不是抓住了这个需求,让人更容易生产更高质量的美.而且视频这种信息量更大的载体相对静止的图片更能让人产生“美”的体验,视频和图片不一样,不像instagram那样加个风格滤镜就能产生一个好的效果,而且要拍好一段视频远比照片要难的多,所以此前一些微视频软件简单的加个滤镜或一些水印并不能帮助用户比较简单的生产出有美感的视频.这点美拍做到了,你发现一段再无趣的视频套用模板后,音乐和剪切效果马上让视频脱胎换骨,