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的方式会比较方便.
ALAssetsLibrary对象则推荐采用单例模式。
2. 所有得到的都为CGImageRef对象.
3. 推荐使用fullScreenImage, 因其已调整过. 而fullResolutionImage尺寸太大, 需要自己调整和缩放.

Demo

Demo地址: DemoALAssetsLibrary

人已赞赏
iOS文章

CocoaPods极简入门指南

2020-4-4 17:01:51

iOS文章

iOS老发[OpenGL ES 01]OpenGL ES之初体验

2020-4-4 18:18:03

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索