AVFoundation拍摄照片(iOS10新框架)
2016-12-07 17:11
786 查看
@interface ViewController () <AVCapturePhotoCaptureDelegate> @property (nonatomic, strong) AVCaptureSession *captureSession; // 会话 @property (nonatomic, strong) AVCaptureDevice *captureDevice; // 输入设备 @property (nonatomic, strong) AVCaptureDeviceInput *captureDeviceInput; // 输入源 @property (nonatomic, strong) AVCapturePhotoOutput *photoOutput; // 图像输出 @property (nonatomic, strong) AVCaptureVideoPreviewLayer *previewLayer; // 预览画面 @property (nonatomic, strong) AVCapturePhotoSettings *photoSettings; // 图像设置 @property (nonatomic, assign) AVCaptureFlashMode mode; @property (nonatomic, assign) AVCaptureDevicePosition position; @end
- (void)setupCaptureSession { self.position = AVCaptureDevicePositionBack; // 1. 创建会话 self.captureSession = [[AVCaptureSession alloc] init]; self.captureSession.sessionPreset = AVCaptureSessionPresetPhoto; // 画质 // 2. 创建输入设备 self.captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; // 3. 创建输入源 self.captureDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:self.captureDevice error:nil]; // 4. 创建图像输出 self.photoOutput = [[AVCapturePhotoOutput alloc] init]; //iOS10 // 5. 连接输入与会话 if ([self.captureSession canAddInput:self.captureDeviceInput]) { [self.captureSession addInput:self.captureDeviceInput]; } // 6. 连接输出与会话 if ([self.captureSession canAddOutput:self.photoOutput]) { [self.captureSession addOutput:self.photoOutput]; } // 7. 预览画面 self.previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.captureSession]; self.previewLayer.frame = self.view.bounds; [self.view.layer insertSublayer:self.previewLayer atIndex:0]; [self.captureSession startRunning]; }
// 拍摄 - (IBAction)startButtonAction:(UIButton *)sender { self.photoSettings = [AVCapturePhotoSettings photoSettingsWithFormat:@{AVVideoCodecKey:AVVideoCodecJPEG}]; [self.photoSettings setFlashMode:self.mode]; [self.photoOutput capturePhotoWithSettings:self.photoSettings delegate:self]; }
// 闪光灯开关 - (IBAction)lightAction:(UIButton *)sender { if (self.mode == AVCaptureFlashModeOn) { [self setMode:AVCaptureFlashModeOff]; } else { [self setMode:AVCaptureFlashModeOn]; } }
// 切换前后摄像头 - (IBAction)cameraPosition:(UIButton *)sender { if (self.position == AVCaptureDevicePositionBack) { self.position = AVCaptureDevicePositionFront; } else { self.position = AVCaptureDevicePositionBack; } AVCaptureDevice * device = [AVCaptureDevice defaultDeviceWithDeviceType:AVCaptureDeviceTypeBuiltInWideAngleCamera mediaType:AVMediaTypeVideo position:self.position]; if (device) { self.captureDevice = device; AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:self.captureDevice error:nil]; [self.captureSession beginConfiguration]; [self.captureSession removeInput:self.captureDeviceInput]; if ([self.captureSession canAddInput:input]) { [self.captureSession addInput:input]; self.captureDeviceInput = input; [self.captureSession commitConfiguration]; } } }
#pragma mark - AVCapturePhotoCaptureDelegate - (void)captureOutput:(AVCapturePhotoOutput *)captureOutput didFinishProcessingPhotoSampleBuffer:(nullable CMSampleBufferRef)photoSampleBuffer previewPhotoSampleBuffer:(nullable CMSampleBufferRef)previewPhotoSampleBuffer resolvedSettings:(AVCaptureResolvedPhotoSettings *)resolvedSettings bracketSettings:(nullable AVCaptureBracketedStillImageSettings *)bracketSettings error:(nullable NSError *)error { NSData *imageData = [AVCapturePhotoOutput JPEGPhotoDataRepresentationForJPEGSampleBuffer:photoSampleBuffer previewPhotoSampleBuffer:previewPhotoSampleBuffer]; UIImage *image = [UIImage imageWithData:imageData]; UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil); NSLog(@"%s", __FUNCTION__); }
相关文章推荐
- ios runtime的一些知识
- iOS JS交互,相互调用
- iOS:编译问题Presenting view controllers on detached view controllers is discouraged
- IOS 自动布局Masonry简介
- iOS 向上取整或向下取整以及常用的数学函数
- 从 iOS AutoLayout 到识别关系链的渐进过程,说开去!
- Nagios PING WARNING 之 DUPLICATES FOUND!
- IOS把图片缓存到本地的几种方法
- iOS 性能调优
- iOS:给Git仓库上传代码时,超过100M会被拒绝(例如github和oschina)
- IOS中常用的字符串、十进制、二进制、十六进制之间互相转换及简单算术和
- 设置gif动图
- ios运行时那些事
- iOS应用之间的跳转
- ios沙盒查找图片展示
- CCS新建BIOS工程的设置问题
- iOS开发中的内存分配(堆和栈)
- iOS滚动Label滚动button--- VXXTextScrollView
- IOS手机号、 邮箱、 电话、 数字、 身份证、 银行卡 正则判断
- 一个股票软件开发了三年的人如何画制iOS k线图