您的位置:首页 > 移动开发 > IOS开发

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__);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: