媒体层图形技术之AssetsLibrary 学习笔记

choudang的专栏

转载自   http://m.blog.csdn.net/blog/choudang/28274519

1.ALAsset

ALAsset类代表相册中的每个资源文件,可以通过它获取资源文件的相关信息还能修改和新建资源文件

 

Asset Properties

  • – valueForProperty:
  •   (1.ALAssetPropertyType 资源的类型(照片,视频)
  •    2.ALAssetPropertyLocation 资源地理位置(无位置信息返回null)
  •    3.ALAssetPropertyDuation 播放时长(照片返回ALErorInvalidProperty)
  •    4.ALAssetPropertyOrientation 方向(共有8个方向,参见:ALAssetOrientation)
  •    5.ALAssetPropertyDate 拍摄时间(包含了年与日时分秒)
  •    6.ALAssetPropertyRepresentations 描述(打印看了下,只有带后缀的名称)
  •    7.ALAssetPropertyURLs(返回一个字典,键值分别是文件名和文件的url)
  •    8.ALAssetPropertyAssetURL 文件的url )
  •   editable  property(指示资源是否可以编辑,只读属性)
  •   originalAsset  property(原始资源。若没有保存修改后资源,则原始资源为nil)

Accessing Representations

  • – defaultRepresentation
  • – representationForUTI:
  • – thumbnail(小正方形的缩略图)
  • – aspectRatioThumbnail(按原始资源长宽比例的缩略图)

Setting New Image and Video Data

  • – setImageData:metadata:completionBlock: 
  • 用给定的image data 替换接收者的image data。
  • – setVideoAtPath:completionBlock: 
  • 用给定的URL的video 替换接收者的video data。

Saving to the Saved Photos Album

  • – writeModifiedImageDataToSavedPhotosAlbum:metadata:completionBlock:
  • 保存image data到Saved Photos album
  • – writeModifiedVideoAtPathToSavedPhotosAlbum:completionBlock: 

 保存video到Saved Photos album的指定路径

//通过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];

 

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);}];


2.ALAssetRepresentation

ALAssetRepresentation类代表相册中每个资源文件的详细信息,可以通过它获取资源的大小,名字,路径等详细信息。

 

ALAssetRepresentation

 

---------------------------------------------------------------------------

        ALAssetRepresentation对象封装了一个给定ALAsset对象的陈述。

        一个在资源库中给定的asset可能有不止一个陈述。比如,如果一个相机提供RAW和JPEG格式的图像版本,

asset将有两个陈述版本,一个是RAW的,一个是JPEG的。

Getting Image Representations

  • – CGImageWithOptions:
  • – fullResolutionImage(完全分辨率的图片)
  • – fullScreenImage(满屏的图片)

Getting Image Attributes

  • – orientation(文件方向)
  • – scale(长宽比例)
  • – filename(文件名字)

Getting Raw Data

  • – size(文件尺寸,以byte为单位)
  • – getBytes:fromOffset:length:error:

Getting Metadata

– UTI

– metadata

 //获取资源图片的详细资源信息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]);


3.ALAssetsFilter

过滤器筛选出想要展现的资源:图片资源、视频资源

 

// Get all photos assets in the assets group.
+ (ALAssetsFilter *)allPhotos;
// Get all video assets in the assets group.
+ (ALAssetsFilter *)allVideos;
// Get all assets in the group.
+ (ALAssetsFilter *)allAssets;


4.ALAssetsGroup

 

Enumerating Assets(遍历资源)

  • – enumerateAssetsUsingBlock:(用一个block来遍历组里的资源)
  • – enumerateAssetsWithOptions:usingBlock:(在枚举选项的条件下,用一个block来遍历组里的资源)
  • – enumerateAssetsAtIndexes:options:usingBlock:(在枚举选项的条件下,用一个block来遍历组里特定index的资源)
- (void)setupAssets
{self.title = [self.assetsGroup valueForProperty:ALAssetsGroupPropertyName];if (!self.assets)self.assets = [[NSMutableArray alloc] init];else[self.assets removeAllObjects];ALAssetsGroupEnumerationResultsBlock resultsBlock = ^(ALAsset *asset, NSUInteger index, BOOL *stop) {if (asset){[self.assets addObject:asset];NSString *type = [asset valueForProperty:ALAssetPropertyType];if ([type isEqual:ALAssetTypePhoto])self.numberOfPhotos ++;if ([type isEqual:ALAssetTypeVideo])self.numberOfVideos ++;}else if (self.assets.count > 0){[self.collectionView reloadData];[self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:self.assets.count-1 inSection:0]atScrollPosition:UICollectionViewScrollPositionTopanimated:YES];}};[self.assetsGroup enumerateAssetsUsingBlock:resultsBlock];
}


Adding Assets(添加资源)

  • – addAsset:(添加一个已存在的asset到接收者。返回yes成功;反之,失败。)
  •   editable  property(指示程序是否可以编辑组,只读属性,打印看了一下,系统自带的是不能编辑的,其它可以编辑)

Filtering(过滤)

  • – numberOfAssets(返回组过滤器条件下的资源个数,若没有设置过滤器,则返回组里的资源个数)
  • – setAssetsFilter:(设置组的过滤器)

Accessing Properties(访问属性)

  • – valueForProperty:(通过组属性名称,获取组属性:组名称,组类型,组永久性ID,组URL)
  • – posterImage(组的封面)

5.ALAssetsLibrary

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

 

 

 //判断当前应用是否能访问相册资源/*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]);//查看相册的存储idNSLog(@"ALAssetsGroupPropertyPersistentID:%@",[group valueForProperty:ALAssetsGroupPropertyPersistentID]);//查看相册存储的位置地址NSLog(@"ALAssetsGroupPropertyURL:%@",[group valueForProperty:ALAssetsGroupPropertyURL]);groupURL = [group valueForProperty:ALAssetsGroupPropertyURL];} failureBlock:^(NSError *error) {}];

 

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



    //通过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) {
        
    }];

利用资源库得枚举函数把资源组分类,代码如下:

 

- (void)setupGroup
{if (!self.assetsLibrary)self.assetsLibrary = [self.class defaultAssetsLibrary];if (!self.groups)self.groups = [[NSMutableArray alloc] init];else[self.groups removeAllObjects];CTAssetsPickerController *picker = (CTAssetsPickerController *)self.navigationController;ALAssetsFilter *assetsFilter = picker.assetsFilter;ALAssetsLibraryGroupsEnumerationResultsBlock resultsBlock = ^(ALAssetsGroup *group, BOOL *stop) {if (group){[group setAssetsFilter:assetsFilter];if (group.numberOfAssets > 0)[self.groups addObject:group];}else{[self reloadData];}};ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error) {[self showNotAllowed];};// Enumerate Camera roll first[self.assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupSavedPhotosusingBlock:resultsBlockfailureBlock:failureBlock];// Then all other groupsNSUInteger type =ALAssetsGroupLibrary | ALAssetsGroupAlbum | ALAssetsGroupEvent |ALAssetsGroupFaces | ALAssetsGroupPhotoStream;[self.assetsLibrary enumerateGroupsWithTypes:typeusingBlock:resultsBlockfailureBlock:failureBlock];
}

 

其中得[self.class defaultAssetsLibrary]为单列形式:

 

#pragma mark - ALAssetsLibrary+ (ALAssetsLibrary *)defaultAssetsLibrary
{static dispatch_once_t pred = 0;static ALAssetsLibrary *library = nil;dispatch_once(&pred, ^{library = [[ALAssetsLibrary alloc] init];});return library;
}




    //保存图片到系统默认的相册中,使用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);
    }];

详情请参考demon:http://download.csdn.net/detail/choudang/7446365

转载于:https://www.cnblogs.com/allanliu/p/4213495.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292074.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jenkins构建触发器定时任务

接上篇Jenkins发布.Net项目到IIS前面说到了把项目部署到iis,那么这边有个问题就是这个部署的触发条件是手工还是需要自动的呢。我觉得这个的看具体的场景&#xff0c;假设团队人员比较多&#xff0c;不断的在提交代码到指定分支&#xff0c;如果是自动化的话&#xff0c; 那么基…

JavaScript基于对象编程

2019独角兽企业重金招聘Python工程师标准>>> JavaScript基于对象编程 1、JavaScript变量/函数声明在代码执行之前被解析&#xff0c;并且变量声明优先级高于函数声明。 代码片段&#xff1a; 1234567var flag test in window;if (!flag){ var te…

idae 安装的插件怎么删掉_X7 IE阻止我安装插件怎么办

为了在网页上表现多彩的多媒体内容&#xff0c;很多网站会要求我们装上相应的网页插件来实现。但IE的默认安全设置会阻止我们进行安装某些网页插件。可是如果不装的话&#xff0c;网页很多媒体的内容就会显示不出来。怎么办呢&#xff1f;其实我们可以调整IE的安全设定来解决。…

MongoDB基本管理命令

2019独角兽企业重金招聘Python工程师标准>>> MongoDB是一个NoSQL数据库系统&#xff1a;一个数据库可以包含多个集合&#xff08;Collection&#xff09;&#xff0c;每个集合对应于关系数据库中的表&#xff1b;而每个集合中可以存储一组由列标识的记录&#xff0c…

花季少女竟然有个三年级老公??!

1 不能直视咖啡了&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 不理外国人的后果&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 猫占鸡巢&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 律师有什么坏心思呢&#xff1f;&#xff08;素材…

dotnet-httpie 0.2.0 Released

dotnet-httpie 0.2.0 ReleasedIntrodotnet-httpie 是类 httpie 的一个调用 HTTP API 的小工具&#xff0c;可以帮助我们快速测试 API&#xff0c;语法和 httpie 基本一样。第一个版本发布之后&#xff0c;做了一些重构&#xff0c;使用 System.CommandLine 重写了对于 Option 的…

黑色边影,

多次 设置frame,并用了动画&#xff0c; [UIViewbeginAnimations:nilcontext:nil]; [UIViewsetAnimationDelegate:self]; [UIViewsetAnimationCurve:[[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]]; [UIViewsetAnimationDuration:[[…

分子模拟软件amber_容天AMBER优化的GPU解决方案

AMBER认证的GPU系统AMBER认证GPU系统提供商容天更快地运行MD仿真容天与AMBER的主要开发商合作开发了交钥匙解决方案&#xff0c;为GPU加速的生物分子模拟提供增值系统。经过验证的系统&#xff0c;每个用户的CPU&#xff0c;GPU&#xff0c;内存和存储具有适当的平衡。从工作站…

linux c之孤儿进程与僵尸进程[总结]

转载地址&#xff1a;http://www.cnblogs.com/Anker/p/3271773.html 1、前言 之前在看《unix环境高级编程》第八章进程时候&#xff0c;提到孤儿进程和僵尸进程&#xff0c;一直对这两个概念比较模糊。今天被人问到什么是孤儿进程和僵尸进程&#xff0c;会带来什么问题&#xf…

留学申请中,你们怎么老让我做科研啊?

全世界只有3.14 % 的人关注了爆炸吧知识太太太太闹心了&#xff0c;真的&#xff0c;留学申请准备这准备那已经很糟心了&#xff0c;怎么总看到让我做科研的广告啊&#xff0c;刚开始看看没在意&#xff0c;越来越多越来越多&#xff0c;不做都感觉赶不上潮流&#xff0c;不做就…

C# Dispose模式

目的为了及时释放宝贵的非托管资源和托管资源&#xff0c;并且保证资源在被 gc 回收的时候可以正确释放资源&#xff0c;同时兼顾执行效率。必须遵循的事实1 . 托管资源释放&#xff1a;  由另一线程的 gc 进行释放&#xff0c;当托管的对象没有被引用时&#xff0c;就会在“…

在ASP.NET项目中使用CKEditor +CKFinder实现图片上传功能

前言 之前的项目中一直使用的是FCKeditor&#xff0c;昨天突然有个想法&#xff1a;为什么不试一下新的CKEditor呢&#xff1f;于是花了大半天的时间去学习它的用法&#xff0c;现在把我的学习过程与大家分享一下。 谈起FCKeditor&#xff0c;相信没几个Web程序员不知道的吧。不…

linux之内核剖析

Linux 内核简介 现在让我们从一个比较高的高度来审视一下 GNU/Linux 操作系统的体系结构。您可以从两个层次上来考虑操作系统&#xff0c;如图 2 所示。 图 2. GNU/Linux 操作系统的基本体系结构 上面是用户&#xff08;或应用程序&#xff09;空间。这是用户应用程序执行的地…

linux笔记 3-4 SMTP,.配置电子邮件传输

***************4.配置电子邮件传输*****************##1.基本电子邮件配置##配置dns服务&#xff0c;添加MX记录两台服务器分别配置 /etc/postfix/main.cf文件myhostname--主机名mydomain--域名myorigin--重写本地发布的电子邮件,使其显示为来自该域。这样有助于确保响应返回入…

希尔排序算法的实现

希尔排序(Shell Sort)是插入排序的一种&#xff0c;它是针对直接插入排序算法的改进。该方法又称缩小增量排序&#xff0c;因DL&#xff0e;Shell于1959年提出而得名。 希尔排序实质上是一种分组插入方法。它的基本思想是&#xff1a;对于n个待排序的数列&#xff0c;取一个小于…

linux c之信号signal处理机制

最近同事的程序设计过程中用到了Linux的signal机制&#xff0c;从而引发了我对Linux中signal机制的思考。Signal机制在Linux中是一个非常常用的进程间通信机制&#xff0c;很多人在使用的时候不会考虑该机制是具体如何实现的。signal机制可以被理解成进程的软中断&#xff0c;因…

技术分享 | 微服务模式下如何高效进行API测试

导读&#xff1a;微服务架构下&#xff0c;API 测试的最大挑战来自于庞大的测试用例数量&#xff0c;以及微服务之间的相互耦合。基于这种挑战&#xff0c;如何进行高效的API测试&#xff0c;选择什么样的方式就比较重要&#xff0c;此文主要是采用契约测试的方法来对微服务模式…