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 を指定することで実現できます。



















