iOS Camera照相机

news/2024/11/30 20:40:12/
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可以用来创建我们自己定制的捕捉解决方案,我们可以在帧数据刚刚从设备上捕捉到时就访问这些数据,而不用等到图像数据被最终确定之后,这就给我们提供相机实时效果以及其他的滤镜操作


http://www.ppmy.cn/news/440923.html

相关文章

android照片苹果手机图片,不必羡慕安卓党,get这四个iPhone手机拍照技巧,你也能拍出好照片...

不必羡慕安卓党,get这四个iPhone手机拍照技巧,你也能拍出好照片 2019-05-23 22:46:00 2点赞 34收藏 0评论 朋友别再吐槽你的iPhone手机拍不出好照片了,只是因为你没有掌握iPhone手机的拍照技巧而已。噜啦啦啦,噜啦啦,今…

android拍照

拍照可以调用系统的相机进行拍照,拍完保存到相应的SD卡目录。最近要用到拍照这个功能,首先试了下调用相机拍照,保存到相应目录,然后用imageview显示的时候感觉,很模糊。可能是图片被压缩的太狠了。所以自己使用Camera写…

Unity拍照功能在iPhoneX上的坑

最近在做一个项目有需要用到拍照功能 , 使用的是Unity提供的方法实现的 , 在其他手机机上这句代码都没有问题 ,但在iPhone X上就不灵了 ,不知道是不是个例, 这里做一下记录 , 希望Unity官方下个版本会修复这个问题 . 问题的提现是在系统弹出申请摄像头权限时, 点击允许授权 , …

Iphone X黑科技大揭秘,这几大摄像功能是要上天!

北京时间 9 月 13 日 凌晨 1 点,苹果在美国召开了 2017 年秋季新品发布会 今年是 iPhone 诞生 10 周年, iPhone 已经三年没有大变样了,因而今年的关注度也是异常的高,各种爆料也是轰炸刷屏了一整年,这次发布会自然也是…

苹果手机html吊起拍照,苹果手机照相技巧

苹果手机照相技巧 苹果手机用得好,也能照出单反大片的感觉,那么当中的照相技巧又有什么呢?下面就随小编一起去阅读苹果手机照相技巧,相信能带给大家帮助。 1. 快速开启相机 虽然iOS平台拥有数量繁多的第三方拍照应用,但…

iPhone如何拍摄惊人的照片

多年来,iPhone彻底改变了摄影行业,这已经不是什么秘密了。苹果公司一直努力保持在智能摄影游戏中的领先地位,每年为其旗舰iPhone机型带来新的硬件和软件相机功能。结果,现代iPhone相机也比以前更复杂-傻瓜相机当然很棒&#xff0c…

iOS实现拍照的焦距调节

实现焦距调节 声明两个属性,遵循手势的协议<UIGestureRecognizerDelegate> /*** 记录开始的缩放比例*/property(nonatomic,assign)CGFloat beginGestureScale;/*** 最后的缩放比例*/property(nonatomic,assign)CGFloat effectiveScale; 这两个属性分别用于记录缩放的比…

新版webkit内核iphonex竖屏拍照旋转90修复导致exifjs使用问题

前言 在我们的 H5 页面中,有人脸上传的功能, 在旧版的 iphone 上, 竖屏拍照之后照片自动旋转 90, 因此前端使用了exif.js来根据照片的 orientation 信息来判断照片是否需要旋转. 但最近出现用户使用 iphoneX 拍照之后相片出现了横屏的情况 探索 一开始以为是 orientation 的…