BREW カメラアプリ 〜 BREW C++ カメラプログラミング 〜
Camera クラスの利用
SimpleCamera クラス
Camera クラスを利用するアプリ本体のコーディングです。
SimpleCamera クラスのヘッダーファイルです。
- SimpleCamera.hpp - #ifndef __SIMPLECAMERA_HPP #define __SIMPLECAMERA_HPP #include <SophiaFramework.hpp> #include "SimpleCamera.bid" #include "Camera.hpp" SFMTYPEDEFCLASS(SimpleCamera) class SimpleCamera : public SFCApplication { SFMSEALCOPY(SimpleCamera) public: static SFCInvokerPtr Factory(Void); private: Camera _camera; enum AppStatus { STATUS_NONE = 0, STATUS_PREVIEW, STATUS_SNAP }; AppStatus _status; SInt16 _brightnessMin; // 明るさの最小値 SInt16 _brightnessMax; // 明るさの最大値 SInt16 _brightness; // 現在の明るさ SInt16 _zoomMin; // ズーム値の最小値 SInt16 _zoomMax; // ズーム値の最大値 SInt16 _zoom; // 現在のズーム値 SimpleCamera(Void); virtual ~SimpleCamera(Void); virtual Bool Invoke(SFXEventConstRef event); Void OnAppStart(AEEAppStartPtr environment); Void OnAppStop(BoolPtr quitable); Bool OnKey(UInt16 key); // カメライベントのコールバック関数 static Void CameraCallback(Camera::StatusEnum status, SFCError error, VoidPtr reference); // カメラ イベントのハンドラ Void OnCamera(Camera::StatusEnum status, SFCError error); // エラーメッセージ表示用 Void PrintError(SFXWideStringConstRef msg); // プレビュー開始 Void PreviewCamera(Void); // スナップ ショット モードで撮影された画像を加工して表示 Void DisplayImage(Void); // 明るさ変更 Void ChangeBrightness(Bool isBrighter); // ズーム Void ChangeZoom(Bool isZoomIn); }; #endif // __SIMPLECAMERA_HPP //
イベントハンドラと画像の取得が重要です。
イベント ハンドラ
イベント ハンドラの登録
// アプリ開始ハンドラ Void SimpleCamera::OnAppStart(AEEAppStartPtr environment) { ... // ここにアプリ開始時の処理を記述します。 // カメラの初期化を行う if (_camera.Initialize( SFXGraphics::GetInstance()->GetDeviceRectangle(), CameraCallback, this) != SFERR_NO_ERROR) { PrintError(SFXWideString("カメラの起動に失敗しました。")); return; } ... }
イベント ハンドラ
Void SimpleCamera::CameraCallback(Camera::StatusEnum status, SFCError error, VoidPtr reference) { SimpleCameraPtr p = reinterpret_cast<SimpleCameraPtr>(reference); p->OnCamera(status, error); } Void SimpleCamera::OnCamera(Camera::StatusEnum status, SFCError error) { if (error != SFERR_NO_ERROR) { // エラーが発生 _camera.Terminate(); _status = STATUS_NONE; PrintError(SFXWideString("カメラに問題が発生しました。")); return; } if (status == Camera::STATUS_ENCODE) { // ビットマップが取得できる状態になった _status = STATUS_SNAP; DisplayImage(); } }
※ イベント ハンドラは静的関数なので、呼び出しは 2 段階です。
Camera クラスはそれ自身がイベント処理を行った後で、登録されたコールバック関数を呼び出します。
Camera::STATUS_ENCODE はスナップショット モードで撮影した画像が取得できる状態です。
SimpleCamera クラスはプレビュー時には何もしません。スナップショット モードでの撮影が完了したとき、DisplayImage 関数を呼び出します。
画像取得
Camera クラスの GetBitmap メンバ関数を呼び出して画像を取得します。
// スナップ ショット モードで撮影した画像を表示 Void SimpleCamera::DisplayImage(Void) { // 取得した画像をネガにする SFXGraphicsPtr pg(SFXGraphics::GetInstance()); SFBBitmapSmp displayBmp(pg->GetDestination()); displayBmp->BltIn(pg->GetDeviceRectangle(), _camera.GetBitmap(), SFXGrid(0, 0), AEE_RO_NOT); pg->Update(); }
この例では、ネガにして表示しています。画面のビットマップを取得し、そこにカメラで取得したビットマップをコピーする際、ラスタ オペレーションとして AEE_RO_NOT を指定することで実現できます。