前回記事の続きです。
前回は、プレビュー表示するところまで書きました。今回は、シャッター撮影して画像をカメラロールに保存するところまで。
出力の準備
プロパティ宣言
@property (nonatomic, strong) AVCaptureStillImageOutput *imageOutput;
出力の初期化
何やら長いですが、前回記事との差分は、「出力の初期化」の2行だけです。
// カメラデバイスの初期化 AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; // 入力の初期化 NSError *error = nil; AVCaptureInput *captureInput = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error]; if (!captureInput) { NSLog(@"ERROR:%@", error); return; } // セッション初期化 AVCaptureSession *captureSession = [[AVCaptureSession alloc] init]; [captureSession addInput:captureInput]; [captureSession beginConfiguration]; captureSession.sessionPreset = AVCaptureSessionPresetPhoto; [captureSession commitConfiguration]; // プレビュー表示 AVCaptureVideoPreviewLayer *previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:captureSession]; previewLayer.automaticallyAdjustsMirroring = NO; previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; previewLayer.frame = self.view.bounds; [self.previewCtr.view.layer insertSublayer:previewLayer atIndex:0]; // 出力の初期化 self.imageOutput = [[AVCaptureStillImageOutput alloc] init]; [captureSession addOutput:self.imageOutput]; // セッション開始 [captureSession startRunning];
シャッターを押したときの処理を実装する
NSData 型を UIImage に変換して、カメラロールに保存する処理を Blocks で記述しています。
- (IBAction)pressShutter { AVCaptureConnection *connection = [[self.imageOutput connections] lastObject]; [self.imageOutput captureStillImageAsynchronouslyFromConnection:connection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) { NSData *data = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer]; UIImage *image = [UIImage imageWithData:data]; ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; [library writeImageToSavedPhotosAlbum:image.CGImage orientation:image.imageOrientation completionBlock:^(NSURL *assetURL, NSError *error) { }]; }]; }
次のステップ
次は、静音カメラ系のような、シャッター音を鳴らさない実装について書きます。