媒体层图形技术之AssetsLibrary

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

Setting New Image and Video Data

Saving to the Saved Photos Album

保存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

Getting Image Attributes

Getting Raw Data

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(遍历资源)

- (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:UICollectionViewScrollPositionTop
                                                animated:YES];
        }
    };

    [self.assetsGroup enumerateAssetsUsingBlock:resultsBlock];
}

Adding Assets(添加资源)

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

Filtering(过滤)

Accessing Properties(访问属性)

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]);
        //查看相册的存储id
        NSLog(@"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:ALAssetsGroupSavedPhotos
                                      usingBlock:resultsBlock
                                    failureBlock:failureBlock];

    // Then all other groups
    NSUInteger type =
    ALAssetsGroupLibrary | ALAssetsGroupAlbum | ALAssetsGroupEvent |
    ALAssetsGroupFaces | ALAssetsGroupPhotoStream;

    [self.assetsLibrary enumerateGroupsWithTypes:type
                                      usingBlock:resultsBlock
                                    failureBlock: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

时间: 2024-08-15 01:21:01

媒体层图形技术之AssetsLibrary的相关文章

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

1.ALAsset ALAsset类代表相册中的每个资源文件,可以通过它获取资源文件的相关信息还能修改和新建资源文件 Asset Properties – valueForProperty:   (1.ALAssetPropertyType 资源的类型(照片,视频)    2.ALAssetPropertyLocation 资源地理位置(无位置信息返回null)    3.ALAssetPropertyDuation 播放时长(照片返回ALErorInvalidProperty) 4.ALAss

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

1.CADisplayLink //自行定義的函式,用來設定使用CADisplayLink的相關參數 -(void)initializeTimer { //theTimer是CADisplayLink型態的指標,用來存放當前的設定狀態 theTimer = [CADisplayLink displayLinkWithTarget:self selector:@selector(countTotalFrames)]; //CADisplayLink內定值就是每秒60張(參數=1),參數=2就是每秒

苹果平台上的媒体流播放技术HLS

近日在和朋友聊起媒体流的服务器端实时转码技术的时候,发现苹果的各种终端上的视频播放并未使用常见的基于UDP的RTSP/RTP,而强制使用了Http Live Stream技术,这里稍稍总结了如下. 苹果的视频数据流播放技术要求 一如苹果的强势作风,苹果对其旗下的iPhone.iPod.iPad.Apple TV各种设备上的视频数据播放有强制的技术限制.首先,说说音视频数据的数据压缩格式要求. 1.必须使用H.264的编码压缩格式.iPhone 3G或者更新版本.iPod touch 第二代或者更

HTTP服务七层架构技术探讨

原文链接http://kb.cnblogs.com/page/158568/ 1. 为什么分层? 计算机领域的体系结构普遍采用了分层的方式. 从整体结构来看: 从最底层的硬件往高层依次有: 操作系统 -> 驱动程序 -> 运行库 -> 系统程序 -> 应用程序等等. 从网络分层模型OSI来讲,由上至下为: 应用层 -> 表示层 -> 会话层 -> 传输层 -> 网络层 -> 数据链路层 -> 物理层 当然实际应用的TCP/IP协议的分层就没OSI

MVC框架显示层——Velocity技术

转自:  http://blog.csdn.net/fasttalk/article/details/398059 Velocity,名称字面翻译为:速度.速率.迅速,用在Web开发里,用过的人可能不多,大都基本知道和在使用Struts,到底Velocity和Struts(Taglib和Tiles)是如何联系?在技术上Velocity要比Struts Struts(Taglib和Tiles)先进,单从技术上考虑可以考虑Velocity:而Struts用的非常普遍,这样的人才也很多,所以对于公司来

鸽子农场媒体微系统技术(上海)有限互联网招募精英人才

鸽姆微媒体系统科技(上海)有限公司该公司其它职位 中国有6万个亿万富翁.平均年龄37岁.95%白手起家!10年后,中国亿万富翁将超过30万人,当中有您吗?想不想知道:你尽管没有做错什么,可是你想不想知道成功者都做对了哪些事情,他们是怎样拥有今天的財富.请用心把每个字看完.不要让不论什么人打搅你.用心思考.短短的三个月您的財富像闪电般的增长! 接下来.您绝对不该错过.95%的人,不愿意花三天的时间.来计划自己的人生.假设你愿意,将会超越95%的人.成为那5%,甚至是0.5%的顶尖人物.注:(网络慢

Excel催化剂开源第46波-按行列排列多个图形技术要点

此篇对应功能出自:第10波-快速排列工作表图形对象 - 简书 https://www.jianshu.com/p/eab71f2969a6 在Excel的对象模型中,列的宽度不是一般所期待的和行高一样是磅为单位,而是由当前所设定的字符大小的字符宽度为单位,致使在根据图片大小来调整列宽时,没有办法调整到位,总是有那么一点点误差. 此篇介绍的图形排列过程中,也会受此困扰,间接使用循环的方式将列宽调整好,或者用当前的ColumnWidth和Width两个值来算他们之间的比例的方式,但仍然有误差,所以E

win7/win8通过媒体流(DLNA技术)共享音乐照片和视频

http://www.jb51.net/os/windows/79421.html 工具/原料 Windows 7/8/10家庭高级版以上版本 家庭WiFi局域网(无须连接互联网) 支持DLNA的手机(开启DLNA功能或使用相应的软件) 方法/步骤 打开Windows 7/8的“控制面板”→“网络和Internet”→“网络和共享中心”→“更改高级共享设置”. 在“高级共享设置”窗口中找到“媒体流”选项区域,点击“选择媒体流”链接. 如果你之前没有开启“媒体流”功能,则窗口中会出现提示,提示你需

ShadowGun 图形技术分析

https://zhuanlan.zhihu.com/p/27966138 ShadowGun虽然是2011年的移动平台的游戏demo,但是里面的很多优化技巧到现在来看都是很值得学习的,毕竟是上过西瓜大会的. 网上现存的两份代码一个是shadow gun sample level,一个游戏场景,没法玩,只有一个摄像机动画,asset store上已经找不到了,另外一个是Shadowgun: Deadzone GM's Kit,带服务器,可以玩,asset store上还可以下载到. 下面就通过阅