その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

【その2】UIImagePickerController を使わないカメラアプリの実装方法

前回記事の続きです。


前回は、プレビュー表示するところまで書きました。今回は、シャッター撮影して画像をカメラロールに保存するところまで。

出力の準備

プロパティ宣言
@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) {
                                                                            }];
                                                  }];
}

次のステップ

次は、静音カメラ系のような、シャッター音を鳴らさない実装について書きます。