博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS中从相机中选取多张照片
阅读量:5065 次
发布时间:2019-06-12

本文共 4844 字,大约阅读时间需要 16 分钟。

  项目要用到图片上传功能,要求读取相册中的全部图片加以展示,由用户选择进行上传。从网上找了大家比较通用的方法,稍加修改,实现了需求。

参考代码:
一、读取相册

1 // Load Albums into assetGroups   2 dispatch_async(dispatch_get_main_queue(), ^   3 {   4     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];   5        6     // Group enumerator Block   7     void (^assetGroupEnumerator)(ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop)    8     {   9         if (group == nil)   10         {  11             return;  12         }  13           14         [self.assetGroups addObject:group];  15   16         // Reload albums  17         [self performSelectorOnMainThread:@selector(reloadTableView) withObject:nil waitUntilDone:YES];  18     };  19       20     // Group Enumerator Failure Block  21     void (^assetGroupEnumberatorFailure)(NSError *) = ^(NSError *error) {  22           23         UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Error" message:[NSString stringWithFormat:@"Album Error: %@ - %@", [error localizedDescription], [error localizedRecoverySuggestion]] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];  24         [alert show];  25         [alert release];  26           27         NSLog(@"A problem occured %@", [error description]);                                       28     };    29               30     // Enumerate Albums  31     [library enumerateGroupsWithTypes:ALAssetsGroupAll  32                            usingBlock:assetGroupEnumerator   33                          failureBlock:assetGroupEnumberatorFailure];  34       35     [pool release];  36 });

上面的代码就是用于读取相册内容的。几点说明:

     1. 因为图片中包含位置信息,因此访问图片资源时,系统会弹出询问框“是否允许访问位置信息”?如果选择否,就会进入这一块 assetGroupEnumberatorFailure,提示读取图片失败。据说ios5.0以后系统才增加了这个提示,之前是没有这种情况的。
     2. ios5.0以后用户可以自己新建相簿,因此这个ALAssetsGroupAll这个值是表示读出所有相簿,你可以把每个相簿列出来,再进一步选择展示 哪个相簿中的图片。开源例子中就是这个效果。不过因为我的需求是只展示系统默认的“相机胶卷”这个相簿中的图片,因此,把这里改为 ALAssetsGroupSavedPhotos这个值,就可以直接读取相机胶卷中的照片,不需要进一步选择了。
二、读取相册中的图片
ELCAssetTablePicker.m中的preparePhotos函数

1 -(void)preparePhotos {   2        3     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];   4    5        6     NSLog(@"enumerating photos");   7     [self.assetGroup enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop)    8      {            9          if(result == nil)   10          {  11              return;  12          }  13            14          ELCAsset *elcAsset = [[[ELCAsset alloc] initWithAsset:result] autorelease];  15          [elcAsset setParent:self];  16          [self.elcAssets addObject:elcAsset];  17      }];      18     NSLog(@"done enumerating photos");  19       20     [self.tableView reloadData];  21     [self.navigationItem setTitle:@"Pick Photos"];  22       23     [pool release];  24   25 }

       在次之前,可以对assetGroup设置过滤,如下设置为只读取图片。因为其实用手机拍摄的视频也会存入“相机胶卷”中,所以可以根据自己的需要进行过滤。

[picker.assetGroupsetAssetsFilter:[ALAssetsFilter allPhotos]];

     每张图片对应的就是一个ALAsset对象。

三、读取出的图片信息

[self.asset thumbnail]

          ALAsset的thumbnail是图片的缩略图,如果你需要以九宫格的形式把图片都展示出来,肯定要展示的是缩略图,而不能是巨大的原图。

1 -(void)selectedAssets:(NSArray*)_assets {   2    3     NSMutableArray *returnArray = [[[NSMutableArray alloc] init] autorelease];   4        5     for(ALAsset *asset in _assets) {   6    7         NSMutableDictionary *workingDictionary = [[NSMutableDictionary alloc] init];   8         [workingDictionary setObject:[asset valueForProperty:ALAssetPropertyType] forKey:@"UIImagePickerControllerMediaType"];   9         [workingDictionary setObject:[UIImage imageWithCGImage:[[asset defaultRepresentation] fullScreenImage]] forKey:@"UIImagePickerControllerOriginalImage"];  10         [workingDictionary setObject:[[asset valueForProperty:ALAssetPropertyURLs] valueForKey:[[[asset valueForProperty:ALAssetPropertyURLs] allKeys] objectAtIndex:0]] forKey:@"UIImagePickerControllerReferenceURL"];  11           12         [returnArray addObject:workingDictionary];  13           14         [workingDictionary release];      15     }  16       17     [self popToRootViewControllerAnimated:NO];  18     [[self parentViewController] dismissModalViewControllerAnimated:YES];  19       20     if([delegate respondsToSelector:@selector(elcImagePickerController:didFinishPickingMediaWithInfo:)]) {  21         [delegate performSelector:@selector(elcImagePickerController:didFinishPickingMediaWithInfo:) withObject:self withObject:[NSArray arrayWithArray:returnArray]];  22     }  23 }

        这个函数,将用户选择的图片的信息记录下来,在主界面上弄个scrollView来一一展示,这里就要用到原图了,开源的例子有问题,居然把图片都加载进去了,选多了必然崩溃呀,反正就是示例吧,没考虑那么细。

        这个函数 中可以看到,ALAsset对象中包括媒体类型、原图、各种的句柄URL之类的(我还没用过),应该足够满足你的需求了。因为我要做的功能是图片的上传功 能,肯定涉及将图片转为NSData进行上传的处理,因此还获取了图片的类型,是png还是jpg,以便调用相应的api进行转码。下面代码能获取,然后 比较是kUTTypePNG还是kUTTypeJPEG。

[[asset defaultRepresentation] UTI]

总结:上述方法算是大家都采用的常规方法了吧,开源的例子挺清楚的,相关界面的实现也有一定参考价值,最终我实现的效果是这样。

PS:顶部的navibar仿照系统的相册,系统提供的方法就足够了,稍微尝试一下,找到最接近系统相册的效果就好了。

转载于:https://www.cnblogs.com/tryingx/articles/3477370.html

你可能感兴趣的文章
团队项目开发客户端——登录子系统的设计
查看>>
【AppScan心得】IBM Rational AppScan 无法记录登录序列
查看>>
[翻译] USING GIT IN XCODE [4] 在XCODE中使用GIT[4]
查看>>
简化通知中心的使用
查看>>
IO—》Properties类&序列化流与反序列化流
查看>>
html 简介
查看>>
session如何保存在专门的StateServer服务器中
查看>>
react展示数据
查看>>
测试计划
查看>>
选择器
查看>>
Mysql与Oracle 的对比
查看>>
idea的maven项目无法引入junit
查看>>
jquery实现限制textarea输入字数
查看>>
thinkphp5 csv格式导入导出(多数据处理)
查看>>
如何获取Android系统时间是24小时制还是12小时制
查看>>
fur168.com 改成5917电影
查看>>
PHP上传RAR压缩包并解压目录
查看>>
Codeforces 719B Anatoly and Cockroaches
查看>>
jenkins常用插件汇总
查看>>
c# 泛型+反射
查看>>