Swift初心者がカメラでの画像撮影について書いたメモです。
普段はTitanium使っててこの辺は楽してます。
あんまり詳しく無いけど Objective-C でなら書いた事あります。
先日作ったViewController へ実装していきます。
主なカメラ撮影の方法
iOSでのカメラ撮影といえば、主に2種類の方法があります。
- UIImagePickerController: UIKitに含まれる。お手軽。
- AVFoundation Framework: 面倒だけど色々できる。
自分は画像を加工とか解析とか色々アレしたりする事が多いので、後者を使います。
前者はTitaniumでいうとTi.MediaのshowCameraとかあたりになります。Tiはこの辺が抽象化されていて扱いがすごく楽で良いのですが、その反面出来ることが限られるので、凝った事しようとすると結局モジュールを作って後者をObjective-Cで書くことになり、AVFoundationだけまぁまぁ判るという事になったりします。
AVFoundation Frameworkで使うクラス達
AVCaptureSession (AVキャプチャセッション)
AVFoundationにおけるキャプチャ入出力をハンドリングする為のクラスです。
まぁ、そういうものだとまる覚えします。
AVCaptureDevice (AVキャプチャデバイス)
前背面カメラやマイク等のデバイスそのものを表すクラスです。
AVCaptureDevieInput (AVキャプチャデバイスインプット)
AVキャプチャデバイスからの入力を表すクラスです。
最初はイメージし辛いですけど、AVFoundation F/W自体のしくみとして、セッションに直接デバイスをぶっ込むのでは無く、デバイスからインプットを生成してセッションにぶっ込む、という仕様になってます。
AVCaputureOutput (AVキャプチャアウトプット)
出力方法を表すクラスです。今回は AVCaptureStillImageOutput を使います。(他に AVCaptureVideoDataOutput も使える様です)
AVCaptureSession の sessionPreset
AVCaptureSession の sessionPresetは種類が色々ありますが、静止画専用の AVCaptureSessionPresetPhoto をセットしておけばデバイスの最大解像度で撮影してくれる筈です。iPhone5 で撮影すると確かに 640 × 1136 でした。
デフォルトはAVCaptureSessionPresetHighらしいです。デフォルトのままiPhone5 で撮影すると、1080 x 1920でした。
つまり一番高解像度なのはAVCaptureSessionPresetHigh (デフォルト) の様です。
セッションの設定を変更するのであれば、その前後で beginConfiguration() と commitConfiguration() をそれぞれ呼んであげましょう。
画面こんな感じ
追々画像をプレビューしたり、加工したりするつもりですが、現状では画面をタップすると撮影しアルバムに保存し、ウィンドウを閉じるだけです。
が、画面がブレてるのは手ブレ補正が効かない iPhone5 のせいだからね!