iOS --- 使用ALAssetsLibrary访问设备中的所有照片信息

ALAssetsLibrary 提供了访问iOS设备下照片应用下所有照片和视频的接口.

从 ALAssetsLibrary 中可读取所有的相册数据,即 ALAssetsGroup 对象列表;

从每个 ALAssetsGroup 中可获取到其中包含的照片或视频列表,即 ALAsset 对象列表.

其层次关系为 ALAssetsLibrary -> ALAssetsGroup -> ALAsset -> ALAssetRepresentation.

1. 每个 ALAsset 可能有多个representations表示, 即ALAssetRepresentation 对象:

2. 使用其defaultRepresentation 方法可获得其默认representations,

3. 使用[asset valueForProperty: ALAssetPropertyRepresentations ]可获取其所有representations的 UTI 数组。

4. 从ALAsset对象可获取缩略图 thumbnail 或 aspectRatioThumbnail ;

5. 从 ALAssetRepresentation 对象可获取全尺寸图片(fullResolutionImage), 全屏图片(fullScreenImage)及图片的各种属性: orientation, dimensions, scale, url, metadata等。

如下代码及其相关注释:

#import <AssetsLibrary/AssetsLibrary.h>

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 64, self.view.frame.size.width - 20, self.view.frame.size.height - 128)];
[self.view addSubview:imageView];

ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
// asynchronous
// 遍历assetsgroup
[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
    if (group) {
        NSLog(@"group : %@", group);
        // 封面图片
        UIImage *cover = [[UIImage alloc] initWithCGImage:[group posterImage]];
        // imageView.image = cover;

        // 同步方法, 只有所有Assets遍历完才返回. 所以防止阻塞UI线程.
        // 遍历Assets Group中的Assets
        // [group setAssetsFilter:[ALAssetsFilter allPhotos]];
        [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop) {
            if (asset) {
                NSLog(@"\nasset : %@", asset);
                NSLog(@"ALAssetPropertyAssetURL : %@", [asset valueForProperty:ALAssetPropertyAssetURL]);

                UIImage *image = [[UIImage alloc] initWithCGImage:[[asset defaultRepresentation] fullScreenImage]];

                // url
                NSString *url = [[[asset defaultRepresentation] url] absoluteString];
                NSLog(@"url : %@", url);

                // 缩略图
                UIImage *thumbnail = [[UIImage alloc] initWithCGImage:[asset thumbnail]];

                UIImage *aspectRatioThumbnail = [[UIImage alloc] initWithCGImage:[asset aspectRatioThumbnail]];

                // 每个ALAsset都可能有多个representation表示, 即ALAssetRepresentation对象.
                // 获取所有representations的UTI数组
                NSArray *utiArrays = [NSArray arrayWithObject:[asset valueForProperty:ALAssetPropertyRepresentations]];
                NSLog(@"utiArrays : %@", utiArrays);

                // 全尺寸图
                UIImage *fullResolutionImage = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]];

                // 全屏图
                UIImage *fullScreenImage = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullScreenImage]];
                imageView.image = fullResolutionImage;

                // 创建时间
                NSString *createTime = (NSString *)[asset valueForProperty:ALAssetPropertyDate];
                NSLog(@"createTime : %@", createTime);

                // 拍摄位置
                NSString *createLocation = (NSString *)[asset valueForProperty:ALAssetPropertyLocation];
                NSLog(@"createLocation : %@", createLocation);

                // 尺寸
                CGSize dimensions = [[asset defaultRepresentation] dimensions];
                NSLog(@"dimensions : %f - %f", dimensions.width, dimensions.height);
            }
        }];
    }
} failureBlock:^(NSError *error) {
    NSLog(@"%@", error);
}];

需要注意的是:

1. 通过ALAssetsLibrary对象获取的其他对象只在该ALAssetsLibrary对象生命期内有效, 即若该ALAssetsLibrary对象被销毁, 则其他从中获取的对象都不能再访问了. 因此, 采用以上block的方式会比较方便.

2. 所有得到的都为CGImageRef对象.

3. 推荐使用fullScreenImage, 因其已调整过. 而fullResolutionImage尺寸太大, 需要自己调整和缩放.

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-24 16:53:58

iOS --- 使用ALAssetsLibrary访问设备中的所有照片信息的相关文章

防止在iOS设备中的Safari将数字识别为电话号码

转:防止在iOS设备中的Safari将数字识别为电话号码 在测试中发现iPad上的Safari总会把长串数字识别为电话号码,文字变成蓝色,点击还会弹出菜单添加到通讯录. 别的地方倒也罢了,如果在用户名中出现数字(手机注册新浪微博的话用户名就是“手机用户xxxxxxxx”),版式会很恶心. 经过测试在a标签中的长串数字不会识别为电话,于是给出现用户名但没有链接的地方嵌套一个无动作的a标签,临时解决了这个问题. 但是这样增加了额外的标签,代码的语义性变得很差,而且对大段文字不能用这个方法. 今天无意

iOS设备中per app vpn,到底需要哪些系统要求?

坑爹的Apple网站资料和MDM厂商资料,大多数说iOS 7.x设备支持per app vpn了,但是没有说明需要哪些系统环境要求. 1. iOS 7.x 设备,当然了 2. iOS 7.x 设备需在MDM服务器上注册并接受管理(MDM服务器比如SAP Afaria(apple configurator可能也可以)可以下发专门的和per app vpn相关的MDM指令) 3.iOS 7.x 设备要安装vpn的客户端.啥?不是内置VPN支持了吗?对比起,这个per app vpn需要iOS设备上面

设备中创建新相册(粘贴)

二:在手机相册(ios设备相册)中创建相册 第一步:向工程里添加AssetsLibrary 库文件 第二步:在项目中"import" 导入库(在哪用就在哪导入) ? 1 #import <AssetsLibrary/AssetsLibrary.h> 核心代码 在需要添加相册的地方调用代码 ? 1 2 3 4 5 6 //添加到相册我让它执行是异步执行的方式,如果不想用这种方式,可以不去开一个线程 dispatch_async(dispatch_get_global_queu

iOS狂暴之路---iOS的第一个应用中能学到哪些知识

一.前文回顾 在之前已经介绍了 iOS的学习路线图,因为中间遇到一些Android开发问题,所以就耽搁了一段时间,那么接下来的这段时间我们将继续开始iOS的狂暴之路学习,按照国际惯例,第一个应用当然是我们的HelloWorld程序了.那么本文将会通过这么一个简单的程序来讲解一下iOS中的程序生命周期,应用中关键的几个对象,项目结构,最后在手把手的创建一个空项目. 二.建立简单程序HelloWorld 下面先用Xcode来新建一个HelloWorld程序: 点击下一步即可: 这里和我们在Andro

使用Adobe Edge Inspect在各种设备中轻松测试同一页面

有过移动网站开发经历的开发者都知道,在各种设备中测试同一页面是一项非常繁琐的工作.现在,我们可以使用Adobe Edge Inspect来简化这一工作.如果使用Edge Inspect,可以在各种设备的浏览器中同时浏览同一页面.另外,该软件中也提供了用于调试的工具,可以轻松调试页面上所存在的任何问题.Web网站所需支持的设备越多,使用Edge Inspect软件所能节省的时间及工作量也将越多. 本文介绍Adobe Edge Inspect的安装及使用方法.虽然Adobe Edge Inspect

IOS 通讯录 (访问,添加,修改)

如何访问用户的通讯录 在iOS中,有2个框架可以访问用户的通讯录 AddressBookUI.framework 提供了联系人列表界面.联系人详情界面.添加联系人界面等 一般用于选择联系人 AddressBook.framework 纯C语言的API,仅仅是获得联系人数据 没有提供UI界面展示,需要自己搭建联系人展示界面 里面的数据类型大部分基于Core Foundation框架,使用起来极其蛋疼 从iOS6开始,需要得到用户的授权才能访问通讯录,因此在使用之前,需要检 查用户是否已经授权 获得

CentOS7,访问CD-ROM中的内容

我们在使用操作系统时,有时会用到光盘.光驱.与windows访问光盘内容的方式不同,在CentOS7中,如果你想访问光驱中的光盘,需要挂载cdrom到本地的一个目录.我自己把这个理解为在本地为光盘内容做了一个镜像.下面来看一下如何操作. mount -t auto /dev/cdrom /mnt/cdrom 解释一下: mount就是挂载命令了. -t auto的意思是告诉mount命令我们需要挂载的那个device上的filesystem是什么类型的,这里用auto好了,CentOS会自动识别

浏览器访问设备出现白条

/******************************************************************************** * 浏览器访问设备出现白条 * 说明: * 使用Chrome访问设备的Web Server,右.下方都出现白条,查找一下webvisu.js中 * 的原因. * * 2017-5-3 台湾 中和区 *********************************************************************

原型设计测试—如何在不同设备中,进行可用性测试

从广义上讲,可用性测试是以用户体验为中心的交互设计测试,通过用户测试来进行产品评估.这种测试的好处是,在投入前端开发.写代码之前,能够对移动应用程序或者网站进行前期测试.那么有人会问,真的有必要这么去做么?我的回答是:除非这款产品没用,否则你会惊讶发现它对用户来说其实很可怕. 毫无疑问,我们甚至可以在没有原型的前提下就进行可用性测试,它可能是信息组织.制作原型导航的最佳途径了.一些流行的原型前测试种类,大概包括:卡片分类.树结构测试及用户面谈.然而,针对不同的对象的测试,又会有相应的差异.下面,