BREW でカメラ (後編) - 1 / 3 -
第 18 回 " BREW でカメラ (前編) "で作成したアプリを機能拡張して、デジカメのように静止画撮影を行うためのプログラミングを解説します。
スナップショット モード
「スナップショット モード」は、デジカメで言えば「シャッター ボタンが押されてシャッターが切れ、メモリ カードに画像が保存されるまで」の状態です。
デジカメでは、被写体のプレビューが画面に表示されます。シャッターボタンを押すと、プレビューは中断し、撮影した画像が画面に表示されます。
最初、カメラをプレビュー モードで起動します。シャッターに相当するキーが押されたらスナップショット モードに切り替えます。こうすれば、BREW でデジカメと同じ処理が実現されます。
モード切り替えの鍵
ICamera インターフェースのインスタンスが取得できた直後、あるいは ICAMERA_Stop 関数を呼んだ状態では、カメラは何もしない待機状態にあります。この状態で ICAMERA_Preview 関数を呼べばプレビュー モードに、ICAMERA_RecordSnapshot 関数を呼べばスナップショット モードに移行します。
※ プレビューとスナップショットのモード切り替えで、それぞれのモードで ICAMERA_RecordSnapshot 関数や ICAMERA_Preview 関数を呼んでもエラーになります。カメラが待機状態であることが前提だからです。
【 BREW カメラアプリの状態遷移フロー 】 |
---|
カメラを停止させるために ICAMERA_Stop 関数を呼んでも、カメラの動作はすぐには停止しません。しばらく経ってから、コールバック関数に通知が来ます。モード切り替えはコールバック関数で行います。
コールバック関数にはカメラが停止したイベントは通知されますが、カメラが停止する以前の状態は通知されまぜん。そのため、アプリ側でアプレット構造体に変数を用意し状態を渡せるようにします。
スナップショット モードは記録専用!?
最初に、撮影する画像に関して、ICAMERA_SetMediaData 関数でファイル名とファイル形式を、ICAMERA_SetSize 関数でサイズを、それぞれ指定します。次に ICAMERA_RecordSnapshot 関数を呼び出して、スナップショット モードに移ります。
BREW には「即時エンコード」と「遅延エンコード」があります。
「即時エンコード」では、ICAMERA_RecordSnapshot 関数を呼ぶと BREW 側でファイル保存までを行います。保存が完了した時点で CAM_STATUS_DONE イベントの通知がなされます。
「遅延エンコード」では、ICAMERA_RecordSnapshot 関数を呼ぶと画像はファイルの代わりにメモリに保存され、 CAM_STATUS_DONE イベントの通知がなされます。
BREW の標準は「即時エンコード」です。「遅延エンコード」の場合、アプリ側でメモリ上の撮影画像を処理できます。
カメラでバーコードを読み取るアプリでは、画像をファイルに保存する必要はありません。ファイルに圧縮されて保存された精度の低い画像を使うと、認識率は下がってしまいます。「遅延エンコード」の方が処理に適しています。
遅延エンコードを使用するには、ICAMERA_RecordSnapshot 関数を呼ぶ前に、
ICAMERA_DeferEncode(pMe->_camera, TRUE);
として、第 2 引数に TRUE を指定して ICAMERA_DeferEncode 関数を呼び出します。
ただし、「遅延エンコード」を使う場合にも、ICAMERA_SetMediaData 関数を呼ぶ必要があります。これは、遅延エンコードも最終的には画像をファイルに保存することを目的として設計されているからです。
ICAMERA_SetMediaData 関数を事前に設定しておかないとスナップショット モードに移行しない機種もあります。
「遅延エンコード」を使用してスナップショット モードでの撮影処理が完了すると、AEECameraNotify 構造体の nStatus 変数に CAM_STATUS_DONE イベントが渡されて、コールバック関数が呼び出されます。
撮影した画像をファイルへ出力するときは、ICAMERA_EncodeSnapshot 関数を呼びます。
【 即時エンコードの処理フロー 】 |
---|
【 遅延エンコードの処理フロー 】 |
サスペンドとレジューム
サスペンドするときは カメラ インターフェース を解放し、レジュームするときは カメラ インターフェース のインスタンスを新たに取得します。
アプリを終了するときもサスペンドするときも カメラ インターフェース の解放が必要です。インターフェースを解放するときには カメラ は停止していなければいけません。
カメラ の停止から カメラ インターフェース の解放までを自動的に処理してくれる機構があると便利です。