UIImagePickerController を使わずにカメラを作ってみる

投稿者: | 2013/01/24

起動直後に撮影可能なカメラを作りたい

現在、カメラ画面を作成中です。

通常、カメラ画面は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 に放り込んで返しています。

UIImageの回転(90,180,270): 開発不定記

 

回転0度に注意

注意点は、回転0度が指定される場合もあるということ。
case 0:を用意して、その場合は何もせずに受け取ったUIImage を返す処理を追加しました。

ちなみに、基本の画像が既に横倒し(90度回転)されていますので、通常撮影時は270度回転を指定してやります。

 

次はシャッターアニメーションと保存確認画面

こうして、どうにかUIImagePickerController を使わないカメラの実装ができました。

が、まだ色々と手を入れねばなりません。

現状、撮影ボタンを押すと画像がカメラロールに保存されますが、何の予告も無く、いつの間にか写真が保存されています。
これでは、撮影しのかどうだかわかりません。

 

シャッターアニメーション

ですから、UIImagePickerController の場合と同じく、シャッターが閉まって開く様なアニメーションを実装したいと考えています。

 

保存前確認画面

また、即時保存だと、気に入った写真でなかった場合も、問答無用でカメラロールに保存されてしまいます。
保存の手前に1クッション。
プレビュー画面を置いて、保存するか否か確認出来るようにしたいと考えています。

 


 

脚注

脚注
01 【UIImage は画像回転のメソッドを持っていない】なんでなんでしょね?不便。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください