使用ALAssetsLibrary读取所有照片

一.ALAssetsLibrary介绍

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

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

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

每个ALAsset可能有多个representations表示,即ALAssetRepresentation对象,使用其defaultRepresentation方法可获得其默认representations,使用[assetvalueForProperty:ALAssetPropertyRepresentations]可获取其所有representations的UTI数组。

从ALAsset对象可获取缩略图thumbnailaspectRatioThumbnail

ALAssetRepresentation对象可获取全尺寸图片(fullResolutionImage),全屏图片(fullScreenImage)及图片的各种属性:orientationdimensionsscaleurlmetadata等。

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

注意:

The lifetimes of objects you get back from a library instance are tied to the lifetime of the library instance.

通过ALAssetsLibrary对象获取的其他对象只在该ALAssetsLibrary对象生命期内有效,若ALAssetsLibrary对象被销毁,则其他从它获取的对象将不能被访问,否则有会错误。

invalid attempt to access ALAssetPrivate past the lifetime of its owning ALAssetsLibrary

ALAssetRepresentation的metadata方法很慢,我在iPhone4 iOS5.1.1中测试,此方法返回需要40-50ms,所以获取图片的个各种属性尽量直接从ALAssetRepresentation中获取,不要读取metadata。这里给出了一个此方法占用内存过多的解释,调用多次也确实很容易会memory warning,或许也能解析其为什么很慢吧。

The method [representation metadata] returns an autoreleased object and possibly creates more autoreleased objects when it executes. All these instances are added to the autorelease pool, waiting to be finally released (and their memory freed) when the ARP gets the chance to drain itself.

系统”相册”程序显示的图片是fullScreenImage,而不是fullResolutionImage,fullResolutionImage尺寸太大,在手机端显示推荐用fullScreenImage。

fullScreenImage已被调整过方向,可直接使用,即

[UIImage imageWithCGImage:representation.fullScreenImage];

使用fullResolutionImage要自己调整方法和scale,即

[UIImageimageWithCGImage:representation.fullResolutionImagescale:representation.scaleorientation:representation.orientation];

二.创建 ALAssetsLibrary对象

使用ALAssetsLibrary之前需导入头文件和AssetsLibrary.framework。

#import...ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc]init];...

三.遍历Assets Group

使用enumerateGroupsWithTypes:usingBlock:failureBlock:方法可遍历assets group;

此方法为异步执行,若之前未被授权过,此方法会向用户请求访问数据的权限;若用户拒绝授权或其他错误则会执行failureBlock;

如果用户关掉了位置服务(Location Services,在设置->通用中),返回的错误为ALAssetsLibraryAccessGloballyDeniedError

enumerationBlock和failureBlock与在调用此方法的线程内执行,若要在背景线程进行遍历,可将遍历代码放入GCD或NSOperation中。

[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup*group, BOOL *stop) {        if (!group) {            [tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];}else{            [groupsArray addObject:group];...        }    } failureBlock:^(NSError*error) {        NSLog(@"error:%@",error);}];

四.遍历Assets Group中的Assets

使用enumerateAssetsUsingBlock:方法或者其他变体方法可遍历ALAssetsGroup中的所有ALAsset;

可通过setAssetsFilter:设置过滤器(ALssetsFilter)使enumerateAssetsUsingBlock:只返回特定类型asset,而numberOfAssets只返回特定类型asset的数量。

可以设置只显示Photo(allPhotos),只显示Video(allVideos),或显示全部(allAssets)。

enumerateAssetsUsingBlock:为同步方法,只有所有Asset遍历完才返回。所以需要将遍历代码放入背景线程,防止阻塞UI线程。

[assetsGroupsetAssetsFilter:[ALAssetsFilterallPhotos]];dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{        [assetsGroupenumerateAssetsUsingBlock:^(ALAsset*result, NSUInteger index, BOOL *stop) {            if (!result) {                [tableViewperformSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];}else{                [assetsArrayaddObject:result];...            }        }];});

五.根据url获取asset

使用ALAssetsLibrary的assetForURL:resultBlock:failureBlock:方法,可根据之前从ALAssetRepresentation中获取的url重新获取ALAsset对象,此方法同enumerateGroupsWithTypes:usingBlock:failureBlock:一样为异步方法。

六.获取Assets的各种属性

相册封面图片 [assetsGroupposterImage];

照片url[[[asset defaultRepresentation] url] absoluteString];

照片缩略图

[asset thumbnail];

[asset aspectRatioThumbnail];

照片全尺寸图

[[asset defaultRepresentation] fullResolutionImage];

照片全屏图

[[asset defaultRepresentation] fullScreenImage];

照片创建时间

[asset valueForProperty:ALAssetPropertyDate];

照片拍摄位置(可能为nil)

[asset valueForProperty:ALAssetPropertyLocation];

照片尺寸

[[asset defaultRepresentation] dimensions];

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容