iOS 5 取景器和实时滤镜的制作

1.使用UIImagePickerController捕捉媒体制作取景器

UIImagePickerController是一个UINavigationController的子类,他是UIKit的一部分,因此不需要添加额外的框架,使用很简单,但却功能强大。我们可以使用它选择来源媒体的类型,UIImagePicker有三种媒体来源可供选择:UIImagePickerControllerSourceTypePhotoLibrary(系统的照片库选择照片),UIImagePickerControllerSourceTypeSavedPhotosAlbum(只能在保存的相册中选择照片),UIImagePickerControllerSourceTypeTypeCamera(使用摄像头来获取图片或视频)。因此我们既可以从本地获取图片,也可以调用摄像头来捕捉新媒体,当我们选择了捕捉的媒体时它就会调用它代理的didFinishPickingMediaWithInfo:方法。UIImagePickerControllerSourceType还允许开发者提供一个视图,叠加在预览视图上面,因此我们可以通过自定义一个视图来制作一个漂亮的取景器。

取景器制作步骤:1创建一个UIImagePickerController,使用摄像头作为来源;2 必须在显示图像选取器之前,加上一个让用户拍照的方法;3简历一个Uiview作为叠加层,你可以像对待任何其他UIView一样来处理这个叠加层,你可以加上动画,加上任意的子视图等等。下面的代码演示了一个简单的取景器。

-(void)showCustomCamera
{
    //创建UIImagePickerController
    picker=[[UIImagePickerController alloc]init];
    picker.sourceType=UIImagePickerControllerSourceTypeCamera;//选取摄像头作为来源
    [picker setDelegate:self];
   
    picker.cameraDevice=UIImagePickerControllerCameraDeviceFront;//强制选取前置摄像头;
    picker.showsCameraControls=NO;//禁用摄像头空件
   
    //创建叠加层
    UIView *overLayView=[[UIView alloc]initWithFrame:self.view.bounds];
    //取景器的背景图片,该图片中间挖掉了一块变成透明,用来显示摄像头获取的图片;
    UIImage *overLayImag=[UIImage imageNamed:@"overLay.png"];
    UIImageView *bgImageView=[[UIImageView alloc]initWithImage:overLayImag];
    [overLayView addSubview:bgImageView];
   
    //在叠加视图上自定义一个拍照按钮
    UIButton *takePhotoBtn=[UIButton buttonWithType:UIButtonTypeCustom];
    [takePhotoBtn setFrame:CGRectMake(74, 370, 178, 37)];
    [takePhotoBtn addTarget:self action:@selector(takePhoto:) forControlEvents:UIControlEventTouchUpInside];
    [overLayView addSubview:takePhotoBtn];
   
    //将视图设置为摄像头的叠加层
    picker.cameraOverlayView=overLayView;
   
    //显示选取器
    [self presentModalViewController:picker animated:YES];
}

-(void)takePhoto:(id)sender
{
    [picker takePicture];//他将会自动调用代理方法完成照片的拍摄;
}

2.使用AV Foundation框架来实现实时滤镜

UIImagePickerController处理的并不是原始摄像头数据,他是在原始数据被处理成图像后才开始访问。而AV Foundation能在原始数据变成图像之前就直接访问它,这就使得我们能够执行一些额外的暗箱操作,来实现实时滤镜的制作。

AVCaptureSession用来控制输入设备(AVCaptureDeviceInput)视频图像到流入输出缓冲区(AVCaptureOutput)的过程。一旦AVCaptureSession启动以后,就会收集来自输入设备的信息,并在适当的时候将这些信息输出到数据缓冲区中。

AVCaptureVideoPreviewLayer默认情况下会显示来自输入设备的原始数据,如果要实现实时滤镜或在这个图层上绘制额外的物体,那么就要冲视频输出缓冲区获取数据帧数据,并对其进行处理,处理完毕后可将像素数据输出到另一个图层或者OpenGL上下文中。

AVCaptureConnection是一个类,用来在AVCaptureInput和AVCaptureOutput之间建立连接。AVCaptureSession必须从AVCaptureConnection中获取实际数据。

相机实时效果制作过程:创建一个新的AVCaptureSession;设置对图像质量的预置值;通过AVCaptureDevice来创建必要的输入捕捉设备如摄像头;通过AVCaptureStillImageOutput或者AVCaptureVideoDataOutput来添加一个输出缓冲区;建立AVCaptureVideoPreviewLayer(预览图层),并将他添加到视图控制器相关联的视图中,成为子视图;启动AVCaptureSession;获取一个AVCaptureConnection的引用,该链接位于AVCaptureInput和AVCaptureVideoDataOutput之间;从AVCaptureVideoDataOutput中抓取单独帧的数据,然后将其显示在自己定制的预览图层中。

总结:

UIImagePickerController可以用于进行简单的媒体捕捉,通过设置属性sourceType和captureMode可以对UIImagePickerController进行简单的配置,让他以不同的分辨率捕捉静止图像或者视频。

AVFoundation可以用来创建我们自己定制的捕捉解决方案,我们可以在帧数据刚刚从设备上捕捉到时就访问这些数据,而不用等到图像数据被最终确定之后,这就给我们提供相机实时效果以及其他的滤镜操作

iOS Camera照相机相关推荐

  1. android Camera照相机技术(二)定制拍照

    定制拍照: 步骤: 打开照相机:Camera.open(独占的,其他程序不能在打开,除非打开的程序将相机释放) 创建SurfaceView对象 添加回调事件监听器(SurfaceHolder.addC ...

  2. android camera 照相机/摄像机

    一.camera启动 1.一个activity启动调用流程:      onCreate()-->onStart()-->onResume()     onCreate():     1. ...

  3. camera 照相机 摄像机

    一.camera启动 1.一个activity启动调用流程:      onCreate()-->onStart()-->onResume()     onCreate():     1. ...

  4. 小程序camera照相机使用canvas webgl 实时替换颜色

    最近开发了一个小程序摄像头拍摄实时替换颜色的功能,要求是将肉眼可见红色替换成带logo的图片,原理是摄像头获取每一帧的图片数据,含有rgba 4个数值,判断rgb三个值是否属于红色范围,如果是,则替换 ...

  5. IOS 使用照相机和图片库

    在程序中使用照相机,或者从相册中选择需要的照片,可以按照以下的步骤实现. 1.生成一个UIImagePickerController对象 2.用presentModalViewController来显 ...

  6. android Camera照相机技术(一)

    Android SDK支持操作Android设备内置的照相机.从Android2.3开始,支持操作多个摄像头(主要指前置摄像头和后置照相机).通过照相机可以拍照和录像. 快速拍照(简单的拍照)直接看代 ...

  7. IOS使用照相机的功能

    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){         ...

  8. iOS打开照相机与本地相册选择图片

    最近正好项目里面要集成"打开照相机与本地相册选择图片"的功能,今天就在这边给大家写一个演示程序:打开相机拍摄后或者在相册中选择一张照片,然后将它显示在界面上.好了废话不多说,因为比 ...

  9. iOS 打开照相机与本地相册选择图片

    最近正好项目里面要集成"打开照相机与本地相册选择图片"的功能,今天就在这边给大家写一个演示程序:打开相机拍摄后或者在相册中选择一张照片,然后将它显示在界面上.好了废话不多说,因为比 ...

最新文章

  1. shuoj 418 丢史蒂芬妮(素数筛+sg函数)
  2. 只需十四步:从零开始掌握 Python 机器学习(附资源)
  3. Python之多进程
  4. zoj 3386 Trick or Treat 三分 求最大值的 最小值
  5. Algorithm I assignment Collinear
  6. 像搭“乐高”一样实现整合式网络安全体系
  7. Android应用程序与SurfaceFlinger服务的连接过程分析
  8. java自定义栈类代码,异常堆栈和自定义类
  9. 春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。...
  10. 内存池的设计和实现总结(一)
  11. 12-自动化测试框架
  12. input在vue中如何一次性上传多张图片_小程序图片上传,存储,获取,显示
  13. 新浪通行证在线申诉找回密码业务逻辑错误导致严重安全漏洞
  14. java拍照搜题软件下载_微信拍照搜答案的小程序 可以拍照搜java题的软件
  15. 登录mysql报错Failed to connect to backoff 或 Failed to get D-Bus connection: Operation not permitted解决方法
  16. 最佳影片被指奥斯卡最差 奈飞进军电影业引发不满
  17. 深入剖析ReentrantLock公平锁与非公平锁源码实现
  18. IDEA 启动项目报错 Error running 'XXXApplication': No jdk for module 'XXX'
  19. java 中的网络编程(Socket、TCP三次握手四次挥手、TCP/UDP/URL)
  20. 读《MacTalk·人生元编程》及Mac常用软件

热门文章

  1. 在ubuntu系统上安装指定版本的gfortran
  2. java 亚马逊 mws_使用Amazon Deep Java库进行Java中的机器学习
  3. Balsamiq Mockups注册码
  4. Mouse without Borders 让键盘和鼠标飞起来
  5. turtle画微笑表情
  6. 我没有基础,能学会Python吗?
  7. [python3][题解]拖拉机
  8. python 泰森多边形边界_泰森多边形
  9. 复杂多边形的三角剖分
  10. 设计图标(logo)