UIImagePickerController获取照片的实现,添加overlay方法 (相机取景框)
DEVELOPER.XIAOYAOLI
技术笔记
简单的利用UIImagePickerController调用iPhone摄像头获取照片的方法,同时介绍了怎么添加overlay,用于自定义预览界面
UIImagePickerController是一种获取摄像头照片取景器的方法,简单的实现方法如下,我加了主要的注释,注意添加
<UIImagePickerControllerDelegate,UINavigationControllerDelegate>这两个代理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
- (IBAction)cameraBtn:(id)sender
{
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;//获取类型是摄像头,还可以是相册
imagePicker.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
imagePicker.allowsEditing = NO;//如果为NO照出来的照片是原图,比如4s和5的iPhone出来的尺寸应该是(2000+)*(3000+),差不多800W像素,如果是YES会有个选择区域的方形方框
// imagePicker.showsCameraControls = NO;//默认是打开的这样才有拍照键,前后摄像头切换的控制,一半设置为NO的时候用于自定义ovelay
// UIImageView *overLayImg = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 640)];
// overLayImg.image = [UIImage imageNamed:@"overlay.png"];
// imagePicker.cameraOverlayView = overLayImg;//3.0以后可以直接设置cameraOverlayView为overlay
// imagePicker.wantsFullScreenLayout = YES;
[self presentModalViewController:imagePicker animated:YES];
}
|
这个代码就可以实现拍照功能了,如果把注释掉的代码加上就可以添加overlayview,比如十字准星,条形码扫描框之类的
那么,如何处理获得的图像呢?利用下面的这个代理方法
- – (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
- {
- UIImage *image= [info objectForKey:@”UIImagePickerControllerOriginalImage”];//可以打印一下这个info,如果用的是可编辑的,那就获取editedImage,不是OriginalImage
- NSData *data = UIImageJPEGRepresentation(image, 1);//转换成JPEG编码
- UIImage *finalImg = [[UIImage imageWithData:data] fixOrientation];
- [self saveImage:finalImg WithName:@”salesImageBig.jpg”];
- [self dismissModalViewControllerAnimated:YES];
- }
大致这些就可以实现拍照获取照片功能了。
关于OVERLAY的补充
这里要补充一点,overlay的添加原理虽然很简单,但是实际应用的时候会遇到一些问题,先说从摄像头取照片儿时的情况
1
|
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
|
这个时候没有状态栏,经过测试(没找到文档),Edit状态的裁剪窗口是320*320的,Y是75所以我可以精确的把overlay匹配位置
如果是album获取的,是不可以在创建UIImagePicker的时候设置overlay的,因为cameraOverlayView顾名思义就是为摄像头准备的,所以要通过UINavigationController的代理方法判断层级后在当前层级添加overlay
此外这里就不是75了,是95,因为album取景是有状态栏的,就像文章最开始的图片
实现方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
if ( [navigationController.viewControllers count] == 3 ) {
//添加自定义信息层
CameraOverLayFrameView *overLayView = [[[NSBundle mainBundle] loadNibNamed:@"CameraOverLayFrameView" owner:self options:nil] objectAtIndex:0];
CGRect theOverLayFrame = CGRectMake(30, 95, 260, 320);
[overLayView setFrame:theOverLayFrame];
[viewController.view addSubview:overLayView];
}
}
|
至于为什么是3,试一试就知道了,这一层是navigation推入的第三级视图
这样看似大功告成了,但事实上会发现在edit模式里这个overLayerView阻挡了移动和拖拽的手势,想当然的设定userInterface也没用,所以需要在自定义的overLayView里实现这个方法:
1
2
3
4
5
6
7
|
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
return NO;
}
|
这样就大功告成了
UIImagePickerController获取照片的实现,添加overlay方法 (相机取景框)的更多相关文章
- 每日学习心得:Js获取Checkboxlist所选值、instanceof 和typeof区别、为Array添加contains方法
2013-11-24 前言: 上周在工作中遇到了一些跟JS以及前台交互的问题,虽然算不上多么高深,但是在解决时也走了一些弯路,所以就总结一下. 1. JS获取checkboxList所选的值 这 ...
- Repeater,ItemDataBound事件,获取绑定列的值,给指定列添加js方法
protected void rp_bf_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ...
- UIImagePickerController 获取相片视频
1.UIImagePickerController的静态方法: imagepicker = [[UIImagePickerController alloc]init]; //UIImagePic ...
- windows下获取IP地址的两种方法
windows下获取IP地址的两种方法: 一种可以获取IPv4和IPv6,但是需要WSAStartup: 一种只能取到IPv4,但是不需要WSAStartup: 如下: 方法一:(可以获取IPv4和I ...
- iOS 获取设备唯一标示符的方法
在开发中会遇到应用需要记录设备标示,即使应用卸载后再安装也可重新识别的情况,在这写一种实现方式--读取设备的UUID(Universally Unique Identifier)并通过KeyChain ...
- paip.uapi 获取网络url内容html 的方法java php ahk c++ python总结.
paip.uapi 获取网络url内容html 的方法java php ahk c++ python总结. 各种语言总结比较,脚本php.python果然是方便.简短,实用. uapi : get_w ...
- Swift - 从ALAsset中获取照片的原图并转换成NSData
ALAsset类代表相册中的每个资源文件,可以通过它获取照片的相关信息,及其对应的原图,全屏图,缩略图等. 当我们想通过一个照片的ALAsset对象,来获取这张照片的原图并将其转换成NSData数据, ...
- JS添加节点方法与JQuery添加节点方法的比较及总结
原生JS添加节点方法与JQuery添加节点方法的比较及总结 一.首先构建一个简单布局,来供下边讲解使用 1.HTML部分代码: <div id="div1">div ...
- PHP获取照片exif信息
在这个没图说个屁的年代,照片还是很重要的.如果照片上传后会自动加上 照片相关信息,那用户体验的确会好很多,本着这个想法,今天尝试了下 PHP获取照片exif信息,重要的是 获取图片的GPS信息,如果再 ...
随机推荐
- Sturct类型装箱时会遇到的问题
Object在拆箱时会在栈空间生成一个临时变量.所以Struct在使用时尽量将内容都声明为readonly为好 [<Struct>] type Point= val mutable X:d ...
- PAT 1037 Magic Coupon
#include <cstdio> #include <cstdlib> #include <vector> #include <algorithm> ...
- Sass学习笔记(三)
一.Sass的控制命令 二.Sass的函数功能 sass中除了可以定义变量,还自备了一系列函数功能,主要包括:字符串函数.数字函数.列表函数.颜色函数.Instrospection函数.三元函数等.当 ...
- Maven学习篇一:依赖了解
1.依赖配置 <project> ... <dependencies> <dependency> <groupId>xx</groupId> ...
- JS基础学习——作用域
JS基础学习--作用域 什么是作用域 变量的作用域就是变量能被访问到的代码范围,比如在下面的这个js代码中,变量a的作用域就是函数foo,因此在全局作用域内的console.log(a)语句不能访问到 ...
- 一键完成SAP部署的秘密,想知道么?
诸如 SAP 这样的企业级应用已成为普遍的流行趋势.考虑到不同行业和需求的特点,所选平台必须能够为不同层面用户和各种 IT 活动提供灵活的容量需求. 此时上云也许是种不错的选择,而想上云的企业,一方面 ...
- android Handler、Thread和Runnable
android里面的创建的Handler对象并不是新建一个新的线程,而是在主线程执行,主线程的消息队列中循环. java中实现一个线程有两种方法,一种是继承Thread类,一种是实现Runnable接 ...
- React学习笔记 - 元素渲染
React Learn Note 3 React学习笔记(三) 标签(空格分隔): React JavaScript 二.元素渲染 元素是构成react应用的最小单位. 元素是普通的对象. 元素是构成 ...
- IOS CoreData的(增删查改)
(1).CoreDataa>什么是CoreDatab>CoreData增删改查 "什么时候使用COredata 什么时候使用FMDatabases"CoreData 在 ...
- groupdel
功能说明:用于删除指定的用户组,此命令不能删除用户归属的主用户组.