• ALAssetsLibrary


     

    ALAssetsLibrary详解

     

    ALAssetsLibrary类是代表系统中整个资源库,使用它可以访问资源库中的资源和保存照片,视频等功能。

        _library = [[ALAssetsLibrary alloc]init];
        //判断当前应用是否能访问相册资源
        /*
         typedef NS_ENUM(NSInteger, ALAuthorizationStatus) {
         ALAuthorizationStatusNotDetermined = 0, 用户尚未做出了选择这个应用程序的问候
         ALAuthorizationStatusRestricted,        此应用程序没有被授权访问的照片数据。可能是家长控制权限。

         ALAuthorizationStatusDenied,            用户已经明确否认了这一照片数据的应用程序访问.
         ALAuthorizationStatusAuthorized         用户已授权应用访问照片数据.
         }
         */

        int author = [ALAssetsLibrary authorizationStatus];
        NSLog(@"author type:%d",author);
        //关闭监听共享照片流产生的频繁通知信息
        [ALAssetsLibrary disableSharedPhotoStreamsSupport];
        
        //创建一个相册到相册资源中,并通过block返回创建成功的相册ALAssetsGroup
        [_library addAssetsGroupAlbumWithName:@"test" resultBlock:^(ALAssetsGroup *group) {
            //NSString *const ALAssetsGroupPropertyName;
            //NSString *const ALAssetsGroupPropertyType;
            //NSString *const ALAssetsGroupPropertyPersistentID;
            //NSString *const ALAssetsGroupPropertyURL;
            //查看相册的名字

            NSLog(@"ALAssetsGroupPropertyName:%@",[group valueForProperty:ALAssetsGroupPropertyName]);
            //查看相册的类型
            NSLog(@"ALAssetsGroupPropertyType:%@",[group valueForProperty:ALAssetsGroupPropertyType]);
            //查看相册的存储id
            NSLog(@"ALAssetsGroupPropertyPersistentID:%@",[group valueForProperty:ALAssetsGroupPropertyPersistentID]);
            //查看相册存储的位置地址
            NSLog(@"ALAssetsGroupPropertyURL:%@",[group valueForProperty:ALAssetsGroupPropertyURL]);
            groupURL = [group valueForProperty:ALAssetsGroupPropertyURL];

        } failureBlock:^(NSError *error) {
            
        }];

     

    新添加了一个名为test的相册


        [NSThread sleepForTimeInterval:0.5];
        //通过url地址在相册资源中获取该地址的资源文件ALAsset,有可能是相片或视频
        [_library assetForURL:[NSURL URLWithString:@""] resultBlock:^(ALAsset *asset) {
            /*
             NSString *const ALAssetPropertyType;
             NSString *const ALAssetPropertyLocation;
             NSString *const ALAssetPropertyDuration;
             NSString *const ALAssetPropertyOrientation;
             NSString *const ALAssetPropertyDate;
             NSString *const ALAssetPropertyRepresentations;
             NSString *const ALAssetPropertyURLs;
             NSString *const ALAssetPropertyAssetURL;
             */

            //查看资源的地理位置信息
            NSLog(@"ALAssetPropertyLocation:%@",[asset valueForProperty:ALAssetPropertyLocation]);
            //如果资源是视频,查看视频的时长
            NSLog(@"ALAssetPropertyDuration:%@",[asset valueForProperty:ALAssetPropertyDuration]);
            //查看资源的方向,图片的旋转方向
            NSLog(@"ALAssetPropertyOrientation:%@",[asset valueForProperty:ALAssetPropertyOrientation]);
            //查看资源的创建时间
            NSLog(@"ALAssetPropertyDate:%@",[asset valueForProperty:ALAssetPropertyDate]);
            //查看资源的描述信息
            NSLog(@"ALAssetPropertyRepresentations:%@",[asset valueForProperty:ALAssetPropertyRepresentations]);
            NSLog(@"ALAssetPropertyURLs:%@",[asset valueForProperty:ALAssetPropertyURLs]);
            //查看资源的url路径
            NSLog(@"ALAssetPropertyAssetURL:%@",[asset valueForProperty:ALAssetPropertyAssetURL]);
        } failureBlock:^(NSError *error) {
            
        }];
        //通过url地址获取相册资源中的一个相册
        [_library groupForURL:groupURL resultBlock:^(ALAssetsGroup *group) {
            NSLog(@"ALAssetsGroupPropertyName:%@",[group valueForProperty:ALAssetsGroupPropertyName]);
        } failureBlock:^(NSError *error) {
        
        }];
        //根据选择的类型遍历相册资源中的相对应类型的所有相册,其中stop行参是指针,表示是否停止迭代,当赋值为false则停止
        /*
         enum {
         ALAssetsGroupLibrary        = (1 << 0),
         ALAssetsGroupAlbum          = (1 << 1),
         ALAssetsGroupEvent          = (1 << 2),
         ALAssetsGroupFaces          = (1 << 3),
         ALAssetsGroupSavedPhotos    = (1 << 4),
         ALAssetsGroupPhotoStream    = (1 << 5),
         ALAssetsGroupAll            = 0xFFFFFFFF,
         };
         */

        [_library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
            NSLog(@"group name:%@",[group valueForProperty:ALAssetsGroupPropertyName]);
        } failureBlock:^(NSError *error) {
            
        }];
        //保存图片到系统默认的相册中,使用nsdata的形式,并返回照片的url地址
        [_library writeImageDataToSavedPhotosAlbum:nil metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {
            
        }];
        //保存图片到系统默认的相册中,使用cgimageref的形式,并返回照片的url地址
        [_library writeImageToSavedPhotosAlbum:nil metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {
            
        }];
        
        //保存图片到系统默认的相册中,使用cgimageref的形式,并且选择图片以什么旋转方向的形式保存,并返回照片的url地址
        /*
         typedef enum {
         ALAssetOrientationUp,            // default orientation
         ALAssetOrientationDown,          // 180 deg rotation
         ALAssetOrientationLeft,          // 90 deg CCW
         ALAssetOrientationRight,         // 90 deg CW
         ALAssetOrientationUpMirrored,    // as above but image mirrored along other axis. horizontal flip
         ALAssetOrientationDownMirrored,  // horizontal flip
         ALAssetOrientationLeftMirrored,  // vertical flip
         ALAssetOrientationRightMirrored, // vertical flip
         } ALAssetOrientation;
         */

        UIImage* image = [UIImage imageNamed:@"test.png"];
        [_library writeImageToSavedPhotosAlbum:[image CGImage] orientation:ALAssetOrientationLeft completionBlock:^(NSURL *assetURL, NSError *error) {
            NSLog(@"save image:%@",assetURL);
        }];

    ALAssetsGroup类是系统用于映射相册资源中的每个相册,可以通过该类获取相册中的资源文件,并且能向相册中添加资源文件

        

        //保存图片到系统默认的相册中,使用cgimageref的形式,并且选择图片以什么旋转方向的形式保存,并返回照片的url地址

        /*
         typedef enum {
         ALAssetOrientationUp,            // default orientation
         ALAssetOrientationDown,          // 180 deg rotation
         ALAssetOrientationLeft,          // 90 deg CCW
         ALAssetOrientationRight,         // 90 deg CW
         ALAssetOrientationUpMirrored,    // as above but image mirrored along other axis. horizontal flip
         ALAssetOrientationDownMirrored,  // horizontal flip
         ALAssetOrientationLeftMirrored,  // vertical flip
         ALAssetOrientationRightMirrored, // vertical flip
         } ALAssetOrientation;
         */

        UIImage* image = [UIImage imageNamed:@"test.png"];
        [_library writeImageToSavedPhotosAlbum:[image CGImage] orientation:ALAssetOrientationLeft completionBlock:^(NSURL *assetURL, NSError *error) {
            NSLog(@"save image:%@",assetURL);
            //通过ALAssetsLibrary迭代取出所有相册
            [_library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
                NSString* groupname = [group valueForProperty:ALAssetsGroupPropertyName];
                //如果相册的名称是test的时候,对其进行操作
                if ([groupname isEqualToString:@"test"]) {
                    //设置相册组的筛选条件,ALAssetsFilter类表示筛选条件,allPhotos代表相册只包含相片,allVideos代表只包含视频,allAssets代表包含所有资源
                    [group setAssetsFilter:[ALAssetsFilter allPhotos]];
                    //通过刚保存的照片的url,把保存到默认相册的照片也保存到test相册中
                    [_library assetForURL:assetURL resultBlock:^(ALAsset *asset) {
                        //添加资源到指定的相册
                        [group addAsset:asset];
                        //获取相册中一共的资源数量
                        int count = [group numberOfAssets];
                        NSLog(@"count:%d",count);
                        dispatch_queue_t main = dispatch_get_main_queue();
                        dispatch_async(main, ^{
                            //获取相册的封面图片
                            CGImageRef poster = [group posterImage];
                            [imageView setImage:[UIImage imageWithCGImage:poster]];
                        });
                        //NSString *const ALAssetsGroupPropertyName;
                        //NSString *const ALAssetsGroupPropertyType;
                        //NSString *const ALAssetsGroupPropertyPersistentID;
                        //NSString *const ALAssetsGroupPropertyURL;
                        //查看相册的名字

                        NSLog(@"ALAssetsGroupPropertyName:%@",[group valueForProperty:ALAssetsGroupPropertyName]);
                        //查看相册的类型
                        NSLog(@"ALAssetsGroupPropertyType:%@",[group valueForProperty:ALAssetsGroupPropertyType]);
                        //查看相册的存储id
                        NSLog(@"ALAssetsGroupPropertyPersistentID:%@",[group valueForProperty:ALAssetsGroupPropertyPersistentID]);
                        //查看相册存储的位置地址
                        NSLog(@"ALAssetsGroupPropertyURL:%@",[group valueForProperty:ALAssetsGroupPropertyURL]);
                        //按遍历顺序获取指定索引的资源,遍历顺序可以是先序或倒序
                        /*
                         enum {
                         NSEnumerationConcurrent = (1UL << 0),
                         NSEnumerationReverse = (1UL << 1),
                         };
                         typedef NSUInteger NSEnumerationOptions;
                         */

                        [group enumerateAssetsAtIndexes:[NSIndexSet indexSetWithIndex:0] options:NSEnumerationConcurrent usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
                            
                        }];
                        //按顺便遍历获取相册中所有的资源,index代表资源的索引,stop赋值为false时,会停止遍历
                        [group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
                            
                        }];
                         //按顺便遍历获取相册中所有的资源,遍历顺序可以是先序或倒序,index代表资源的索引,stop赋值为false时,会停止遍历
                        [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {
                            
                        }];
                        
                    } failureBlock:^(NSError *error) {
                        
                    }];
                }
            } failureBlock:^(NSError *error) {
                
            }];
        }];

    ALAsset类代表相册中的每个资源文件,可以通过它获取资源文件的相关信息还能修改和新建资源文件,ALAssetRepresentation类代表相册中每个资源文件的详细信息,可以通过它获取资源的大小,名字,路径等详细信息。

                            //通过ALAsset获取相对应的资源,获取图片的等比缩略图,原图的等比缩略
                            CGImageRef ratioThum = [asset aspectRatioThumbnail];
                            //获取相片的缩略图,该缩略图是相册中每张照片的poster图
                            CGImageRef thum = [asset thumbnail];
                            UIImage* rti = [UIImage imageWithCGImage:ratioThum];
                            UIImage* ti = [UIImage imageWithCGImage:thum];
                            UIImageView* v1 = [[UIImageView alloc]initWithFrame:CGRectMake(20, 100, 120, 200)];
                            v1.image = rti;
                            v1.contentMode = UIViewContentModeScaleAspectFit;
                            UIImageView* v2 = [[UIImageView alloc]initWithFrame:CGRectMake(180, 100, 120, 200)];
                            v2.image = ti;
                            v2.contentMode = UIViewContentModeScaleAspectFit;
                            [self.view addSubview:v1];
                            [self.view addSubview:v2];

     

    左侧为等比缩略图效果,右侧为poster效果的缩略图


                            UIImage* ni = [UIImage imageNamed:@"new.png"];
                            //修改指定路径的图片资源内容,替换掉原来的内容
                            [asset setImageData:UIImageJPEGRepresentation(ni, 1.0) metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {
                                NSLog(@"new:%@",assetURL);
                            }];
                            //根据给定的图片内容,重新生成一张新图
                            [asset writeModifiedImageDataToSavedPhotosAlbum:UIImageJPEGRepresentation(ni, 1.0) metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {
                                NSLog(@"new:%@",assetURL);
                            }];
                            //获取资源图片的详细资源信息
                            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]);



    自定义系统图片多选相册,类似于微信的在相册中选择多张照片的功能

     

    AssetGroupViewController,用于显示系统有多少个相册给用户选择

    AssetsViewController用于显示选择的相册中的所有图片资源,以collection的形式显示

    AssetCollectionCell自定义cell,每个cell中定义需要显示的图片个数

    CustomImageView用于自定义每个显示图片的view,添加点击事件用于通知选择了或取消选择了哪些图片

    实现效果如下:

  • 相关阅读:
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    HTML语义化
    使用全角空格进行文本对齐
    安卓手机微信中清除页面缓存的方法
    jQuery与Vue的对比
    IDE提交Git出现husky>pre-commit错误
    IDEA将工程转为maven工程
    vscode设置tab缩进字符数
    mac系统下用nginx服务器部署页面
  • 原文地址:https://www.cnblogs.com/liyufeng2013/p/3707453.html
Copyright © 2020-2023  润新知