ALAssetsLibrary多图片选择和保存图片视频

在开发,我们经常会碰到这么种需求,从相册中选择图片,一般使用UIImagePickerController这个类,但是这个类有个缺陷,不能同时选择多张图片,其实我们还有更好的方式访问相册中的图片,使用ALAssetsLibrary就是一个很好的解决方案,使用ALAssetsLibrary同时还可以将图片,和视频保存到系统照片中。

1将图片视频保存到相册中

一般步骤先初始化ALAssetsLibrary一个对象,然后通过ALAssetsLibrary的方法写到相册中去,但是有个缺陷这都写到了系统相册中,很多应用可以自己生成自己的相册,比如QQ和一些拍照app。于是写了个ALAssetsLibrary分类,可以将图片或者视频写入到制定的相册中,代码如下:

@interface ALAssetsLibrary (addALAsset)

- (void)toolWriteImageToSavedPhotosAlbum:(CGImageRef)imageRef orientation:(ALAssetOrientation)orientation completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock groupName:(NSString*)groupName;

- (void)toolWriteImageToSavedPhotosAlbum:(CGImageRef)imageRef metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock groupName:(NSString*)groupName;

- (void)toolWriteImageDataToSavedPhotosAlbum:(NSData *)imageData metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock groupName:(NSString*)groupName;

- (void)toolWriteVideoAtPathToSavedPhotosAlbum:(NSURL *)videoPathURL completionBlock:(ALAssetsLibraryWriteVideoCompletionBlock)completionBlock groupName:(NSString*)groupName;

@end

说明一下groupName就是相册的名字,根据需求命名,如果没有以groupName命名的相册,将会创建groupName命名的相册。

实现如下,只是列举一个例子:

- (void)toolWriteImageToSavedPhotosAlbum:(CGImageRef)imageRef orientation:(ALAssetOrientation)orientation completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock groupName:(NSString*)groupName
{
    ALAssetsLibraryWriteImageCompletionBlock block = [self compositionBlock:completionBlock withGroupName:groupName];
    [self writeImageToSavedPhotosAlbum:imageRef orientation:orientation completionBlock:block];
}

其实实现还是调用ALAssetsLibrary自身的方法,我只是对传进来的block进行了扩展,添加了创建相册和向相册中添加图片或视频的功能。对block做了什么扩展?

-(void (^)(NSURL *assetURL, NSError *error))compositionBlock:(void (^)(NSURL *assetURL, NSError *error))block withGroupName:(NSString*)groupName
{
    void (^completionBlok)(NSURL *assetURL, NSError *error) = ^(NSURL *assetURL, NSError *error)
    {
        
        [self addAssetsGroupAlbumWithName:groupName resultBlock:^(ALAssetsGroup *group) {
            //图片中没有该相册,创建成功
            if (group) {
                
                [self assetForURL:assetURL resultBlock:^(ALAsset *asset) {
                    [group addAsset:asset];
                    
                } failureBlock:^(NSError *error) {
                    //没有授权或者其他失败
                }];
                
            }//由同名的创建失败
            else
            {
                [self enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
                    
                    if([[group valueForProperty:ALAssetsGroupPropertyName] isEqualToString:groupName])
                    {
                        [self assetForURL:assetURL resultBlock:^(ALAsset *asset) {
                            [group addAsset:asset];
                            
                        } failureBlock:^(NSError *error) {
                            
                        }];
                        
                        *stop = YES;
                    }
                    
                } failureBlock:^(NSError *error) {
                    //没有授权或者其他失败
                }];

            }
            
        } failureBlock:^(NSError *error) {
            //没有授权或者其他失败
        }];
        
        block(assetURL,error);
    };
    return [completionBlok copy];
}

说明一下,该block是在成功保存图片视频到相册中的回调,首先尝试创建groupName命名的相册,如果已经存在groupName命名的相册,将会创建失败,放回ALAssetsGroup(可以理解为代表相册)的对象为nil。此时说明已经存在该相册,通过名称枚举该相册,得到ALAssetsGroup对象,就是我们要的相册,然后添加图片视频到该相册中。如果创建成功,直接将视频图片添加的相册中,具体见代码。通过以上方法就可以将图片,视频添加到以groupName命名的相册中 了。

2多图片选择

该功能主要是提供一种向相册获取一张或者多张的图片(当然也可以是视频,只是这里没有处理视频类型,即便选择了视频也只是获取视频的一个缩图)。说白了就是就是对ALAssetsLibrary和ALAssetsGrouph以及ALAsset的使用,当然也会用到ALAssetRepresentation,这里也用到了ALAssetRepresentation类,通过这个类可以获得ALAsset更详细的东西。
图片选择提供了三种类型,可以根据需求选择,

typedef NS_ENUM(NSInteger,ChoosetImgType)
{
    //缩略图,默认为缩略图
    ChoosetImgTypeThumbnail=0,
    //图片的高清图
    ChoosetImgTypefullResolutionImage=1,
    //图片的全屏图
    ChoosetImgTypefullScreenImage=2,
};

枚举相册,说明一下该方法为异步的

  [self.library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
        if (group) {
            JGImgGroup *imgGroup = [JGImgGroup imgGroupWithGroup:group];
            [self.groupArr addObject:imgGroup];
            [self.tableView reloadData];
        }
    } failureBlock:^(NSError *error) {
        
    }];

从相册中枚举图片视频资源,说明一下该方法为同步的,很可能需要在子线程中获取

-(void)setupAlAssetData
{
 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        if (self.imgGroup) {
            [self.imgGroup.group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
                if (result) {
                    [self.alassetArr addObject:result];
                }
            }];
        }
        dispatch_async(dispatch_get_main_queue(), ^{
            [self setupUI];
        });
        
    });   
}

选择图片进行回调,根据选择的图片类型

-(void)selectImg:(UIButton*)btn
{
    NSMutableArray *chooseImgs = [NSMutableArray array];
    if (self.chooseImgType == ChoosetImgTypeThumbnail) {
        for(int i = 0 ;i < self.alassetArr.count ; i++)
        {
            JGDisplayImgView *displayView = self.imgViewArr[i];
            if (displayView.isSelected) {
                ALAsset *alasset = self.alassetArr[i];
                UIImage *img = [UIImage imageWithCGImage:alasset.thumbnail];
                [chooseImgs addObject:img];
            }
        }
    }
    else
    {
        for(int i = 0 ;i < self.alassetArr.count ; i++)
        {
            JGDisplayImgView *displayView = self.imgViewArr[i];
            if (displayView.isSelected)
            {
                ALAsset *alasset = self.alassetArr[i];
                ALAssetRepresentation *alassetPresentation = [alasset defaultRepresentation];
                UIImage *img = nil;
                if (self.chooseImgType == ChoosetImgTypefullResolutionImage) {
                    img = [UIImage imageWithCGImage:[alassetPresentation fullResolutionImage]];
                }
                else if(self.chooseImgType == ChoosetImgTypefullScreenImage)
                {
                    img = [UIImage imageWithCGImage:[alassetPresentation fullScreenImage]];
                }
                if (img) {
                    [chooseImgs addObject:img];
                }
            }
        }
    }
    if (self.delegate && [self.delegate respondsToSelector:@selector(selectSecceedWithImgs:)]) {
        [self.delegate selectSecceedWithImgs:chooseImgs];
    }
    if (self.mainVc) {
        [self.mainVc dismissViewControllerAnimated:YES completion:nil];
    }
}
屏幕快照 2015-12-31 下午12.24.21.png

点击图片选择按钮,当选中时还有缩放效果,具体细节这就不说了,感兴趣可以自己下载看看,有问题可以回复,github下载地址:https://github.com/jiangtaidi/JGALAssetsLibrary

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

推荐阅读更多精彩内容