码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-08-30 12:56:25      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:ios

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尺寸太大, 需要自己调整和缩放.

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

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

标签:ios

原文地址:http://blog.csdn.net/icetime17/article/details/47789471

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!