起動直後に撮影可能なカメラを作りたい
現在、カメラ画面を作成中です。
通常、カメラ画面はUIImagePickerController をモーダルで呼び出します。
つまり、毎回カメラがひょこっと出てくる1クッションが必要です。
それがどうにも不満で、今回はアプリ起動直後に撮影可能なカメラを作ることにしました。
AVFoundation.framework で作る
ちょうどタイムリーに@Shu223 さんがこんな記事を上げて下さっていました。
AVFoundation.framework を使って実装するカメラです。
これを写経することで簡単にUIImagePickerController を使わないカメラを作れました。
【その1】UIImagePickerController を使わないカメラアプリの実装方法 – Over&Out その後
画像が常にランドスケープ
さて、簡単に出来たは良いですが、大きな問題が1つ。
撮影した画像が全てランドスケープ(横向き)で保存されてしまうのです。
どうやらAVCaptureVideoDataOutput から受け取るデータは常にランドスケープになるらしいです。
【コラム】実践! iPhoneアプリ開発 (41) ビデオカメラアプリの作り方(2) – ビデオ画像の表示 | 開発・SE | マイナビニュース
撮影時のiPhone の傾きに応じて画像を回転してやる
そんなわけで、自前で画像の回転処理をかましてやる必要があります。
撮影時のiPhone の傾きを検知し、それに応じて回転角度を指定してやりましょう。
まず、iPhone の傾き検知と取得。
こちらを参考にしました。
EZ-NET: iPhone デバイスの回転を検出する : Objective-C プログラミング
iPhone の傾きは4つだけじゃない
注意点は、UIDeviceOrientationUnknown(傾き方向がわからない) とかUIDeviceOrientationFaceUp(液晶上向き)、UIDeviceOrientationFaceDown(液晶下向き)の存在。
これらの場合は、写真の向きを決めようが無いので、とりあえずポートレイト(縦方向)に固定します。
UIImage は直接回転できない
さて、回転方向を決めたらクルッと回転しておしまい…とは行きませんでした。
どうやらUIImage は画像回転のメソッドを持っていないようです。 *01【UIImage は画像回転のメソッドを持っていない】なんでなんでしょね?不便。
そんなわけで回転方法をGoogle 先生に聞いてみたところ、こちらの記事が見つかりました。
CGContext にいったんかき出してから回転し、再びUIImage に放り込んで返しています。
回転0度に注意
注意点は、回転0度が指定される場合もあるということ。
case 0:を用意して、その場合は何もせずに受け取ったUIImage を返す処理を追加しました。
ちなみに、基本の画像が既に横倒し(90度回転)されていますので、通常撮影時は270度回転を指定してやります。
次はシャッターアニメーションと保存確認画面
こうして、どうにかUIImagePickerController を使わないカメラの実装ができました。
が、まだ色々と手を入れねばなりません。
現状、撮影ボタンを押すと画像がカメラロールに保存されますが、何の予告も無く、いつの間にか写真が保存されています。
これでは、撮影しのかどうだかわかりません。
シャッターアニメーション
ですから、UIImagePickerController の場合と同じく、シャッターが閉まって開く様なアニメーションを実装したいと考えています。
保存前確認画面
また、即時保存だと、気に入った写真でなかった場合も、問答無用でカメラロールに保存されてしまいます。
保存の手前に1クッション。
プレビュー画面を置いて、保存するか否か確認出来るようにしたいと考えています。
脚注
↩01 | 【UIImage は画像回転のメソッドを持っていない】なんでなんでしょね?不便。 |
---|