AVFoundation (AVCaptureStillImageOutput)

◼︎ヘッダー

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>

@interface ViewController : UIViewController
- (IBAction)takeButton:(UIButton *)sender;

@end

◼︎実行ファイル

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
{
    AVCaptureSession* session;
    AVCaptureStillImageOutput * stillImageOutput;
    UIView * previewView;
}


- (void)viewDidLoad
{
    [super viewDidLoad];
    
    [self AVCaptureSetup];

}


// AVCaputureSetup
- (void)AVCaptureSetup
{
    // セッション作成
    session = [[AVCaptureSession alloc] init];
    session.sessionPreset = AVCaptureSessionPresetHigh;  // セッション画質設定
    
    // デバイス取得
    AVCaptureDevice* device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    
    // 入力作成
    AVCaptureDeviceInput* deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:NULL];
    [session addInput:deviceInput];  // セッションに追加
    
    // 出力作成
    stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
    [session addOutput:stillImageOutput]; // セッションに追加
    
    // プレビュー作成
    AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];
    captureVideoPreviewLayer.frame = self.view.bounds;
    captureVideoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
    
    // プレビューを表示
    previewView = [[UIView alloc]initWithFrame:self.view.bounds]; // 初期化
    [self.view addSubview:previewView]; // ビューを画面に貼り付け
    [self.view sendSubviewToBack:previewView]; // ビューを最背面に移動

    // プレビューに画像表示
    CALayer *previewLayer = previewView.layer;
    previewLayer.masksToBounds = YES; // マスク設定(Viewからはみ出た部分を削除)
    [previewLayer addSublayer:captureVideoPreviewLayer];

    // セッション開始
    [session startRunning];
}


// 撮影メソッド
- (void)takePhoto
{
    // ビデオコネクションを取得
    AVCaptureConnection * connection = [stillImageOutput connectionWithMediaType:AVMediaTypeVideo];
    
    // 画像撮影
    [stillImageOutput captureStillImageAsynchronouslyFromConnection:connection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error)
     {
         NSData *data = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
         UIImage * image = [[UIImage alloc]initWithData:data];
         
         // カメラロールに保存
         UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
         
     }];
}



// 撮影ボタンメソッド
- (IBAction)takeButton:(UIButton *)sender
{
    [self takePhoto];

}



@end