AssetLibrary
2017-05-13 本文已影响67人
堂吉诃德灬
AssetLibrary组成
AssetLibrary:代表整个设备中的资源库(照片库),通过AssetLibrary可以获取设备中的照片和视频,同时也可以增加相册或将照片写入相册
ALAssetsGroup:映射照片库中的相册组,通过ALAssetsGroup可以获取某个相册的信息以及相册下的资源,同时也可以对某个相册添加资源
ALAsset:映射照片库中的一个照片或者视频,通过ALAsset可以获取某个照片或者视频的详细信息,或者保存照片和视频
ALAssetRepressentation:ALAssetRepresentation 是对 ALAsset 的封装(但不是其子类),可以更方便地获取 ALAsset 中的资源信息,每个 ALAsset 都有至少有一个 ALAssetRepresentation 对象,可以通过 defaultRepresentation 获取。而例如使用系统相机应用拍摄的 RAW + JPEG 照片,则会有两个 ALAssetRepresentation,一个封装了照片的 RAW 信息,另一个则封装了照片的 JPEG 信息
AssetLibrary方法
将图片写入相册的方法:
//将图片写入相册中,图片是CGImage类型的,可以通过[UIImage CGImage]来获得
- (void)writeImageToSavedPhotosAlbum:(CGImageRef)imageRef orientation:(ALAssetOrientation)orientation completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock
//将图片保存到相册,同时在metadata字典中指定图片的方向
- (void)writeImageToSavedPhotosAlbum:(CGImageRef)imageRef metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock
//将图片保存到相册,同时如果图像数据和元数据冲突,图像数据将被重写
//有关元数据可以看这一篇文章 http://blog.csdn.net/zhi_sheng/article/details/52595523
- (void)writeImageDataToSavedPhotosAlbum:(NSData *)imageData metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock
在上面的方法中orientation有这么几个选项:
ALAssetOrientationUp 上
ALAssetOrientationDown 下
ALAssetOrientationLeft 左
ALAssetOrientationRight 右
ALAssetOrientationUpMirrored 水平上翻转
ALAssetOrientationDownMirrored 水平下翻转
ALAssetOrientationLeftMirrored 竖直左翻转
ALAssetOrientationRightMirrored 竖直右翻转
从相册资源库读取相册的方法:
//遍历AssetLibrary得到的是ALAssetsGroup
- (void)enumerateGroupsWithTypes:(ALAssetsGroupType)types usingBlock:(ALAssetsLibraryGroupsEnumerationResultsBlock)enumerationBlock failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock
types的类型:
ALAssetsGroupLibrary 所有的相册(包括本地和 iTunes 的)
ALAssetsGroupAlbum 同步得到iTunes的和创建的(不包括共享的)
ALAssetsGroupEvent 同步到 iTunes 的(包括相机导入的)
ALAssetsGroupFaces 同步 iTunes 的
ALAssetsGroupSavedPhotos 所有相册(包括相机导入的)
ALAssetsGroupPhotoStream itunes 同步的(包括共享的)
ALAssetsGroupAll 所有可见的相册
使用代码范例:
ALAssetsLibrary *assetsLibrary;
NSMutableArray *groupArray;
assetsLibrary = [[ALAssetsLibrary alloc] init];
groupArray=[[NSMutableArray alloc] initWithCapacity:1];
[assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
if (group) {
[groupArray addObject:group];
// 通过这个可以知道相册的名字,从而也可以知道安装的部分应用
//例如 Name:柚子相机, Type:Album, Assets count:1
NSLog(@"%@",group);
}
} failureBlock:^(NSError *error) {
NSLog(@"Group not found!\n");
}];
//该方法为异步执行的方法,会在调用此方法的线程内执行
ALAssetsGroup的方法以及属性
- (id)valueForProperty:(NSString *)property:返回相册的一些属性它有以下几个键:
extern NSString *const ALAssetsGroupPropertyName 相册的名称
extern NSString *const ALAssetsGroupPropertyType 相册的类型
extern NSString *const ALAssetsGroupPropertyPersistentID 相册的标示 id
extern NSString *const ALAssetsGroupPropertyURL 相册的 url
- (CGImageRef)posterImage 返回相册的封面,且该封面图片的方向是正确的
- (void)setAssetsFilter:(ALAssetsFilter *)filter 设置相册的筛选条件,它有以下几个键:
//所有的照片
+ (ALAssetsFilter *)allPhotos;
// 所有的视频
+ (ALAssetsFilter *)allVideos;
// 相册里的所有资源,包括照片和视频
+ (ALAssetsFilter *)allAssets;
- (NSInteger)numberOfAssets 相册里面资源的数量,这个资源数量和刚才设置的过滤器有关
//遍历相册里面的所有资源,得到的是ALAsset对象
- (void)enumerateAssetsUsingBlock:(ALAssetsGroupEnumerationResultsBlock)enumerationBlock
代码实用范例:
[_group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
if (result) {
[imageArray addObject:result];
NSLog(@"%@",result);
iv.image=[UIImage imageWithCGImage: result.thumbnail];
NSString *type=[result valueForProperty:ALAssetPropertyType];
}
}];
//该方法为同步执行的方法,需要遍历完才能返回,所以一般需要放在后台线程
ALAsset的方法及属性
- (id)valueForProperty:(NSString *)property 获取照片相关的各种属性,这些属性的键为
ALAssetPropertyType 资源的类型(照片,视频)
ALAssetPropertyLocation 资源地理位置(无位置信息返回null)
ALAssetPropertyDuation 播放时长(照片返回ALErorInvalidProperty)
ALAssetPropertyOrientation 方向(共有8个方向,参见:ALAssetOrientation)
ALAssetPropertyDate 拍摄时间(包含了年与日时分秒)
ALAssetPropertyRepresentations 描述(打印看了下,只有带后缀的名称)
ALAssetPropertyURLs(返回一个字典,键值分别是文件名和文件的url)
ALAssetPropertyAssetURL (文件的url )
- (CGImageRef)thumbnail 照片缩略图(这个方法获得的是质量不高的缩略图,它是从图片中间进行正方形的裁剪,没有按比例缩放)
- (CGImageRef)aspectRatioThumbnail 获得照片的缩略图,相比于上一个方法,它是进行比例缩放的
保存图片到相册:
- (void)writeModifiedImageDataToSavedPhotosAlbum:(NSData *)imageData metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock;
保存图片到相册:
imageData:要保存的图片流,
metadata:保存图片的元数据,一般为 nil,如果和前面的 imageData 冲突的话,会覆盖掉前面的信息,
completionBlock:保存完的 block 回调,定义为:typedef void (^ALAssetsLibraryWriteImageCompletionBlock)(NSURL *assetURL, NSError *error),
assetUrl: 保存成功后映射该相片的 url
error: 保存失败信息.
- (ALAssetRepresentation *)defaultRepresentation 获取该图片的详细信息返回的是ALAssetRepresentation对象
ALAssetRepresentation方法及属性
- (NSString *)UTI 图片资源UTI 唯一标识符
- (CGSize)dimensions 获取图片的长宽
- (long long)size 图片资源容量大小
- (CGImageRef)fullResolutionImage 图片资源的高清图
- (CGImageRef)fullScreenImage 图片资源全屏图,相比于上一个方法,使用它得到的图片足够
- (NSURL *)url 资源图片url地址,该地址和ALAsset通过ALAssetPropertyAssetURL获取的url地址是一样的
- (NSDictionary *)metadata 资源图片数据
- (ALAssetOrientation)orientation 资源图片旋转方向
- (float)scale 资源图片缩放倍数
- (NSString *)filename 资源图片的名字
注意:在用ALAssetsLibrary遍历照片时,group的筛选条件一定要在遍历方法成功的block里面设定,不然有些应用自定义创建的照片文件夹扫描不出来