iOS开发里面要访问本地的相册那么除了UIImagePickerController之外就是AssetsLibrary框架了,那么我们下面就了解一下AssetsLibrary框架。
该框架下有几个类:ALAssetsLibrary,AlAssetsGroup,ALAsset,ALAssetsFilter和AlAssetRepresentation。下面呢我们就一个一个的简单了解下。
ALAssetsLibrary类可以实现查看相册列表,增加相册,保存图片到相册等功能。
例如enumerateGroupsWithTypes方法列举所有相册。
ALAssetsGroup就是相册的类,可以通过valueForProperty方法查看不同属性的值,如:ALAssetsGroupPropertyName,相册名。
ALAssetsGroup类有几个方法,posterImage方法就是相册的封面图片,numberOfAssets方法获取该相册的图片视频数量,可以通过enumerateAssetsUsingBlock方法列举出所有照片。
ALAssetsGroup 可以使用setAssetsFilter:(ALAssetsFilter *)filter过滤照片或者视频等。
首先是获取所有相册,通过ALAssetsLibrary的实例方法得到ALAssetsGroup类数组。
//获取本地所有相册
ALAssetsLibraryGroupsEnumerationResultsBlock listGroupBlock = ^(ALAssetsGroup *group,BOOL *stop){
//添加过滤操作,得到所有相片
ALAssetsFilter *onlyPhotosFilter = [ALAssetsFilter allPhotos];
[group setAssetsFilter:onlyPhotosFilter];
if (group.numberOfAssets) {
//添加判断,过滤掉空的相册,得到本地所有的相册
[self.imageGroup addObject:group];
}else{
[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
}
};
NSUInteger groupTypes = ALAssetsGroupAll;
[self.assetsLibrary enumerateGroupsWithTypes:groupTypes usingBlock:listGroupBlock failureBlock:^(NSError *error) {
//如果失败,可能因为授权问题
NSLog(@"Not found any group!\n");
}];
ALAsset类也可以通过valueForProperty方法查看不同属性的值,如:ALAssetPropertyType,asset的类型,有三种ALAssetTypePhoto, ALAssetTypeVideo or ALAssetTypeUnknown。
另外还可以通过该方法获取ALAssetPropertyLocation(照片位置),ALAssetPropertyDuration(视频时间),ALAssetPropertyDate(照片拍摄日期)等。
可以通过thumbnail方法就是获取该照片。根据相册获取该相册下所有图片,通过ALAssetsGroup的实例方法得到ALAsset类数组。
[seletGroup enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
// 1.获取相片的缩略图(模糊,但是页面非常流畅)
UIImage *image1 = [UIImage imageWithCGImage:result.thumbnail];
/* // 2.获取相片(比上面一种要清晰,不过如果相片多的话页面会稍显卡顿) UIImage *image2 = [UIImage imageWithCGImage:result.aspectRatioThumbnail]; // 3.获取高清相片(比较消耗内存资源,可能会出现应用卡死) ALAssetRepresentation *representation = [result defaultRepresentation]; UIImage *image3 = [UIImage imageWithCGImage:[representation fullResolutionImage]]; // 4.获取全屏相片(同样比较消耗内存资源) UIImage *image4 = [UIImage imageWithCGImage:[representation fullScreenImage]]; */
if (image1) {
[images addObject:image1];
}
}];
ALAsset类有一个defaultRepresentation方法,返回值是ALAssetRepresentation类,该类的作用就是获取该资源图片的详细资源信息。
//获取资源图片的详细资源信息
ALAssetRepresentation* representation = [asset defaultRepresentation];
//获取资源图片的长宽
CGSize dimension = [representation dimensions];
//获取资源图片的高清图
[representation fullResolutionImage];
//获取资源图片的全屏图
[representation fullScreenImage];
//获取资源图片的名字
NSString* filename = [representation filename];
NSLog(@"filename:%@",filename);
//缩放倍数
[representation scale];
//图片资源容量大小
[representation size];
//图片资源原数据
[representation metadata];
//旋转方向
[representation orientation];
//资源图片url地址,该地址和ALAsset通过ALAssetPropertyAssetURL获取的url地址是一样的
NSURL* url = [representation url];
NSLog(@"url:%@",url);
//资源图片uti,唯一标示符
NSLog(@"uti:%@",[representation UTI]);
有需要demo的小伙伴请戳这里哦
另外iOS系统也提供了我们创建相册和保存相片到本地相册的方法,
//创建相册
[library addAssetsGroupAlbumWithName:KPhotoName resultBlock:^(ALAssetsGroup *group) {
// 创建成功后的操作
} failureBlock:^(NSError *error) {
// 创建失败
}];
保存相片到本地指定的相册,保存相片到本地系统的方法比较繁琐,所以就在github上面找到了一种比较便捷的保存相片的方法,而且也可以方便的保存视频等文件。如果有需要的小伙伴可以到我的资源下载,免费的哦!大家互相学习下!
- (void)saveImageData:(NSData *)imageData toAlbum:(NSString *)albumName metadata:(NSDictionary *)metadata completion:(ALAssetsLibraryWriteImageCompletionBlock)completion failure:(ALAssetsLibraryAccessFailureBlock)failure;