iOS 相册多选 相机选择图片

article/2025/10/1 12:15:46

前言

经过几天的断断续续的编写终于把这一个小项目完成了,现在刚刚完成,代码看着不整洁,请多包涵。
前几天要弄个相册多选和照相选图的功能,以前做过单选上传头像之类的。但是多选确实不像那么简单,github找了好多的例子,都是在用几个框架。不是说人家封的不好,封的很好,但是卤煮比较笨,看了好久还是马马虎虎。然后上网查了下资料,还是决定自己写一个。

demo传送门在此,哈哈哈

正文

多选主要是需要一个frameworks:AssetsLibrary。这个类的主要功能就是多选(个人理解,不对请见谅)。
首先,我们从相册开始:
要查看所有的相册,简单的思路大家应该都有:获取相册组---获取相册,但是怎么进行呢,AssetsLibrary的用处来了。

- (void)countOfAlbumGroup:(void(^)(ALAssetsGroup *yfGroup))block{//计算有几个相册[self enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {if (group) {[group setAssetsFilter:[ALAssetsFilter allPhotos]];if (block) {block(group);}}} failureBlock:^(NSError *error) {NSLog(@"获取相册错误,%@",error);}];}

这个是计算相册数,可能手机相册会有好几个,所以要查看一下有几个,毕竟用户有很大的可能只会选择某一个相册里面的某一张相片。我是把这个方法拿了出来专门创建了一个类,这样代码思路会清晰一些。
既然我们知道有几个相册了,每个相册的一些信息也知道了,那么我们应该去显示某一个相册里面的所有照片了呀。这一步的代码来了:

/***  获得一个相册有多少照片**/
- (void)callAllPhoto:(ALAssetsGroup *)group result:(void(^)(YFSelfImage *image))block{//获得所有的图片资源[group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {if (result) {YFSelfImage *image = [[YFSelfImage alloc]initWithCGImage:[result thumbnail]];image.asset = result;block(image);}}];
}

这个方法的一个参数group,就是上一个代码段得到的相册group,拿到group之后就去求里面所有的照片。这里涉及到两个点我说一下:

YFSelfImage

这是一个我自己稍微封装了uiimage的一个类

/***  用于储存相册图片,附有一个asset信息,用于图片的其他处理**/
#import <UIKit/UIKit.h>
#import <AssetsLibrary/AssetsLibrary.h>
@interface YFSelfImage : UIImage
//可能需要的图片信息
@property(nonatomic,strong)ALAsset *asset;
@end

比普通的UIImage多了一个属性,asset。这一个就是要说的第二个点。

ALAsset

这一个类应该是多选里面最关联的一个类了,它有照片的信息关联,比如缩略图之类的都可以通过它获取。所以,我们多选全靠它去做事情。(关于用法和属性,请google吧,网上有很多很多)。
好了,现在相册里面的照片也获取了,我要把它都显示出来了,哎呀呀呀呀,龟派气功波~~~~~~

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{YFShowAlbumCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:SHOWCELL forIndexPath:indexPath];YFSelfImage *image = [_dataArray objectAtIndex:indexPath.row];cell.imageView.image = image;return cell;
}

然后我们可以查看效果了:
相册组:
相册组
相册:
相册
好了,基本的显示完成了,大家也看到了,我上面有个完成按钮。那么我们是不是需要在照片那来个选择按钮,然后我们得到选择的图片是吧,不然只是实现查看相册有什么卵用。
再次编辑collectionview:

 YFShowAlbumCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:SHOWCELL forIndexPath:indexPath];cell.selectBtn.tag = cellIndex;//按钮选中块__weak typeof(self)weakSelf = self;cell.selectedBlock = ^(NSInteger index){//把选中的图片放倒一个数组里面[weakSelf.selectedArray addObject:[weakSelf.dataArray objectAtIndex:index]];selectBtn.userInteractionEnabled = YES;};//取消选定cell.cancelBlock = ^(NSInteger index){//找出取消的cellYFSelfImage *oldImage = [weakSelf.dataArray objectAtIndex:index];//从选中的数组去除for (YFSelfImage *newImage in weakSelf.selectedArray) {if (newImage == oldImage) {//移除[weakSelf.selectedArray removeObject:newImage];//判断完成按钮是否可以使用if(weakSelf.selectedArray.count <= 0){selectBtn.userInteractionEnabled = NO;}return ;}}};
YFSelfImage *image = [_dataArray objectAtIndex:cellIndex];cell.imageView.image = image;return cell;
}

再来看一下效果:
这里写图片描述
好了,现在我们是可以选择了,现在我们要实现的是把我们选择的照片拿到放到一个数组里面保存使用。前段代码大家应该看见了,照片按钮的选中与取选操作都谢了,我们现在完成“完成”这个按钮操作了:

/***  完成选定*/
- (void)successChoose{//把选择的图片传送过去NSDictionary *dic = @{@"cellImage":self.selectedArray};[[NSNotificationCenter defaultCenter]postNotificationName:@"pushImage" object:nil userInfo:dic];//退出模态[self dismissViewControllerAnimated:YES completion:^{//这一步确保退出到显示界面的时候显示相册组控制器一定退出[self.navigationController popViewControllerAnimated:YES];}];
}

这个有个解释点:
就是数退出模态后又做了一次导航pop。因为这个项目的界面布局是:
这里写图片描述
所以,我从单相册显示界面dismiss相当于直接回到开始界面,但是你在下一次在进入相册组界面的时候会出问题,它会直接进入单相册显示界面,也就是说在你dismiss之后后者两个界面貌似没有释放的样子,还是记住了相册组界面push到单相册界面的状态。所以我在此处做了一个pop,防止出现这个问题。
在完成按钮时,我已经选择了通过通知把数组带回了开始界面。所以开始界面会有我们所选择的照片的显示。
这里写图片描述
这里说一下,这个删除事件我就不讲了,大家一看应该都懂的。略过~~~~~~
好了,现在开始相机选择照片这一块:
首先我们打开一下相册,固定死代码:

/***  打开相机*/
- (void)showCamera{//选择相机UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera;UIImagePickerController *picker = [[UIImagePickerController alloc] init];//初始化picker.delegate = self;// picker.allowsEditing = YES;//设置可编辑picker.sourceType = sourceType;//进入照相界面[[self getCurrentVC] presentViewController:picker animated:YES completion:nil];
}

然后嘞,嘎嘎,照了照片之后,我们选择这张照片,那么学问来了,我们选择这张照片可以直接去

- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info{}

这个代理里面去做操作,当然为了和相册多选照片的属性一致,我们需要做点操作。首先思路应该是把照的照片先放到相册,然后我们去相册去拿到这个相册最后一张图片,就是这个相机照的图片。
多说无益,上代码:

- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info{//    //图片UIImage *image;//判断是不是从相机过来的if (picker.sourceType != UIImagePickerControllerSourceTypePhotoLibrary) {//关闭相机[picker dismissViewControllerAnimated:YES completion:nil];image = [info objectForKey:UIImagePickerControllerOriginalImage];}//通过判断picker的sourceType,如果是拍照则保存到相册去.非常重要的一步,不然,无法获取照相的图片if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);}
}
/***  确定相机图片保存到系统相册后,进行图片获取*/
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {NSLog(@"已保存");//操作获得的照片,我这是直接显示,你那个你加到你显示的一组里面去显示去就好了ALAssetsLibrary *library = [[ALAssetsLibrary alloc]init];//操作获得的照片,我这是直接显示,你那个你加到你显示的一组里面去显示去就好了[library afterCameraAsset:^(ALAsset *asset) {YFSelfImage *image = [[YFSelfImage alloc]initWithCGImage:asset.thumbnail];image.asset = asset;//传递NSDictionary *dic = @{@"saveImage":image};[[NSNotificationCenter defaultCenter]postNotificationName:@"SAVEIMAGE" object:nil userInfo:dic];}];}

好了,现在我们获到了相机图片。
然后我还是选择发送一个通知把照片传给显示页。

结语

好了,好了,不行了,不写了。应该也差不多了。还有一些小的功能没有写,一切都在代码里面。


http://chatgpt.dhexx.cn/article/QyBq4txf.shtml

相关文章

工业相机和镜头选型技巧

工业相机和镜头选型技巧 一、加接圈&#xff0c;视野为什么会变小&#xff1f;1、视野公式理解2、加接圈后视野变小分析 二、在如下试验台中&#xff0c;加了接圈&#xff0c;图像要清晰&#xff0c;那么相机高度应该如何调整&#xff1f;1、试验台场景2、像距、物距和焦距的关…

工业视觉检测如何选择合适的工业相机?

1、根据应用的不同分别选用CCD或CMOS相机CCD工业相机主要应用在运动物体的图像提取&#xff0c;如贴片机机器视觉&#xff0c;当然随着CMOS技术的发展&#xff0c;许多贴片机也在选用CMOS工业相机。用在视觉自动检查的方案或行业中一般用CCD工业相机比较多。CMOS工业相机由成本…

【工业相机】【深度3】相机选择-精度和曝光需求计算 - 输入:1 被测试物体的最小体积 2 被测物体的移动相对速度

前言&#xff1a;本举例&#xff0c;说明&#xff0c;我们在工业场景下&#xff0c;如果需要在某个速度下计算某个尺寸的物体的工业相机的精度计算方法 1 需求定义 本需求定义为测量一个有移动速度的工业被测物体&#xff1a; 输入参数标识输入参数举例FOVFOV12寸&#xff08…

机器视觉-相机选择方法-缺陷检测

主要分为三部分 1.相机示意图及基本结构 2.相机参数确定方法 3.最终选择 1.相机示意图及基本结构 简图↑ 全图↑ 光圈与景深↑ 2.相机基本参数确定 视野与像素确定 被检测石英镜片的最大直径为38.6mm。也就是最大弥散圆直径。 样品↑ 较小划痕样本↑ 划痕测量↑ 如上图&…

iOS相机选择器

最近有很多朋友加我QQ, 说是在iOS8相机遇到问题.http://blog.csdn.net/chenyong05314/article/details/44812085 本人在使用相机这块时, 所有东西都封装到了一个类里面, 外部使用只需要一行代码, 非常方便, 现分享出来供大家使用. 代码示例: // Controller 为弹出的VC [[Ca…

Swift使用UIImagePickerController 从相册选择图片、从相机选择图片

配置&#xff1a; 如果是相机使用&#xff0c;需要在info.plist文件增加使用前应用程序说明&#xff1b;相机使用也是如此。&#xff08;第二个是CALENDARS权限&#xff0c;打错了&#xff1b;图片是Photo Library Usage Description&#xff09; 从相册选择图片&#xff1a…

摄影小白入门相机选择(个人出发)

1.微单与卡片机 在产品质量上&#xff0c;相机的感光器件CMOS这些&#xff0c;可以一概认为&#xff0c;同价同质。 两者的区别主要在镜头的设计&#xff0c;黑卡被设计为不可更换镜头式无反相机&#xff0c;入门级别的一般搭配标准变焦镜头 如16-55这种焦距&#xff0c;旗舰级…

机器视觉系统中相机镜头选型技巧_工业相机在机器视觉系统中的地位和作用

一、什么是工业相机 工业相机是机器视觉系统中的一个关键组件,其最本质的功能就是将光信号转变成有序的电信号。选择合适的相机也是机器视觉系统设计中的重要环节,相机的选择不仅直接决定所采集到的图像分辨率、图像质量等,同时也与整个系统的运行模式直接相关。 二、工业相…

栅格重投影(投影变换)

OpenLayers能够在不同的坐标系统中显示来自WMS、WMTS、静态图像和许多其他源的栅格数据。图像的地图重投影直接发生在web浏览器中。在任何Proj4js支持的坐标参考系统中都是可视的&#xff0c;并且以前不兼容的图层现在可以组合和叠加。 使用&#xff1a; API的使用非常简单。…

坐标系与投影变换

所有空间数据必须纳入到相同空间参考基准下才可以进行空间分析&#xff0c;因此坐标系和投影变换十分重要&#xff0c;这也是地理信息系统的基础。坐标系是数据或地图的属性&#xff0c;而投影是坐标系的属性。 一、地球形状&#xff08;三级逼近&#xff09; 地球表面→ 大地水…

Opencv——几何空间变换(仿射变换和投影变换)

几何空间变换 【1】几何变换&#xff08;空间变换&#xff09;简述【2】变换矩阵知识简述齐次坐标的概念几何运算矩阵 【3】图像的仿射变换1、平移变换2、比例缩放3、旋转4、对称变换&#xff08;不做展示&#xff09;1、关于X轴变换2、关于Y轴变换3、关于直线YX变换4、关于直线…

仿射变换和投影变换

1. 仿射变换 1) 用途 旋转 (线性变换)&#xff0c;平移 (向量加)&#xff0e;缩放(线性变换)&#xff0c;错切&#xff0c;反转 2) 方法 仿射变换是一种二维坐标到二维坐标之间的线性变换&#xff0c;它保持了二维图形的“平直性”&#xff08;直线经过变换之后依然是直线&…

三维图形的投影变换

1.平行投影: 1.1 正轴投影: 我们通常说的三视图是指正视图、俯视图和侧视图, 投影平面分别与 x,y,z 轴垂直。 正视图:(yz) 俯视图:(xy) 侧视图:(xz) 1.2 正轴测投影: 如图: 咱们希望按照这个平面对物体进行平行投影: 首先,先把物体及投影面沿着y轴顺时针旋转,在绕x轴逆时针…

华科_图形学笔记_07_投影变换

计算机图形学_华中科技大学_中国大学MOOC(慕课) 7.1_有趣的投影 由于我们的观察设备是二维的&#xff0c;因此&#xff0c;最终都存在一个三维向二维的映射过程。这个映射过程&#xff0c;按照几何意义来说就是投影。 而在我们之前讲到的观察变换中&#xff0c;其实还有一个隐…

Opengl投影变换理解

坐标到达观察空间之后&#xff0c;我们需要将其投影到裁剪坐标。裁剪坐标会被处理至-1.0到1.0的范围内&#xff0c;并判断哪些顶点将会出现在屏幕上。 而[-1.0,1.0]构成的正方体又叫规则观察体(Canonical View Volume, CVV) 一、流程 计算机显示器是一个 2D 表面。OpenGL 渲染…

图形学-(视图变换,投影变换)

1.视图变换 在 3 维物体变到二维平面的过程中&#xff0c;我们需要规定好相机的位置。对于相机所做的变换就是视图变换 &#xff08;Viewing/Camera transformation&#xff09;。 我们需要对相机位置进行定义&#xff0c;对于一个相机我们要规定下面三个属性&#xff1a; 相…

4.3 投影变换

投影变换的目的就是定义一个视景体,使得视景体外多余的部分裁剪掉,最终图像只是视景体内的有关部分。 投影也是使用矩阵来实现的。计算一个用于实现透视投影或者平行投影的矩阵,并把它与当前的投影矩阵(一般是单位矩阵)相乘。 OpenGL支持两种类型的投影变换,即透视投影…

读书笔记-opencv-投影变换

读书笔记-opencv-投影变换 原理解析 ​ 透视变换是将图片投影到一个新的视平面&#xff0c;也称作投影映射&#xff0e;它是二维&#xff08;x,y&#xff09;到三维(X,Y,Z)&#xff0c;再到另一个二维(x′,y′)空间的映射&#xff0e;相对于仿射变换&#xff0c;它提供了更大…

计算机图形学 | 投影变换

计算机图形学 | 投影变换 计算机图形学 | 投影变换7.1 有趣的投影投影的概念平行投影正投影斜投影 透视投影 7.2 规范化的投影变换观察的要素观察空间规范化的投影变换 华中科技大学《计算机图形学》课程 MOOC地址&#xff1a;计算机图形学&#xff08;HUST&#xff09; 计算…