BLOG

Swiftでカメラを実装したい①

こんにちは、TYと申します。
今回はSwift5とiOS12でカメラ機能を実装したいと思います。

Swiftの基本操作はわかってきた。そろそろ踏み込んでもいいのでは?と思い、よく使われるであろう「カメラ」を実装してみようと思う。

ググってみるとカメラを実装できるフレームワークは複数あるらしい。

調査①

UIkit.frameworkのUIImagePickerController

UIImagePickerController

https://developer.apple.com/documentation/uikit/uiimagepickercontroller

これを使えば簡単に写真、動画、編集機能を実装できるらしい。しかし、プレビュー画面の編集はオリジナルに加工できないとある。

今回の実装するカメラは、プレビュー画面をオリジナルにしたいのでこれは不採用。

調査②

AVFoundation.frameworkのAVCaptureStillImageOutput

AVCaptureStillImageOutput

https://developer.apple.com/documentation/avfoundation/avcapturestillimageoutput

これを使えばプレビュー画面に別のViewを重ねたりできるがUIImagePickerControllerと比べて実装が複雑らしい。

複雑なのは嫌だが、汎用性を求めるのであれば仕方あるまい、採用!

使用するフレームワークも決まったので、早速実装してみる。

まずは、フレームワークをインポート

import UIKit
import AVFoundation

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

入出力を管理するAVCaptureSessionクラスを使用して、カメラの画質を設定、次に画質の設定はAVcaptureSession.sessionPresetプロパティで実施します。

数々の画質設定が用意されていましたが、今回は高解像度の画像出力ができるphotoを設定しました。

// デバイスからの入力と出力を管理するオブジェクトの作成
var session = AVCaptureSession()
// 画質の設定 
func setupCaptureSession() {
    session.sessionPreset = AVCaptureSession.Preset.photo 
}

デバイスを管理するAVCaptureDeviceクラスを使用してデバイスの本体の設定を実施します。

// デバイスの設定
var device: AVCaptureDevice!
func setupDevice() {
    // カメラデバイスのプロパティ設定
    //背面カメラを選択
    device = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)
}

ここで入出力データを設定します。

デバイスのカメラの入力を初期化します。設定した情報をAVCaptureDeviceInputクラスを使用し、AVCaptureSessionに追加します。

最後にAVCapturePhotoOutputオブジェクトをAVCaptureSessionに追加します。

func setupDevice() {
    //セッションを生成
       session = AVCaptureSession()
       //背面カメラを選択
       device = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back)
       //背面カメラからキャプチャ入力生成
       guard let input = try? AVCaptureDeviceInput(device: device)
    else {
           print("例外発生")
           return
       }
       session.addInput(input)
    output = AVCapturePhotoOutput()
       session.addOutput(output)
}

ここまでできた!!が、カメラの映像を画面に表示するのはまだまだ手間がいるらしい。

次回はカメラの映像を画面に表示し、シャッターボタンの作成やUIの設定まで行いたいと思います。

BLOGトップへ戻る