Cameralibを使ってC++ Builder CEでプログラム作成

FMXでも簡単です

を使って、アプリケーションを作る。この記事で取り上げたminimumなアプリケーションから、

のような機能満載アプリケーションまで一応作れます。さて、C++ Builder CEでこのライブラリを使う場合は、VCLでもFMXでもコンソールプログラムのどれからも可能なんですが、上記のCamera Remote Control 64の場合は、TColorButton丸いボタンを使いたいがためにFMXで書きました。上記のminimumなプログラムが、VCLベースだったので、今回はTColorButtonを使ったものを作りますかね。まずFMXなアプリケーションを作り始めます。C++ Builder CEを起動して、

ウエルカムページの新規作成から上図下線の”マルチデバイスアプリケーション – C++ Builder”を選択。

ここは上側の“空のアプリケーション”でOK。

ここで一旦セーブするのが吉です。

トップメニューのファイルから“すべて保存”を選択。

上図のダイアログで”新しいフォルダー”を選択し、適切な名前のフォルダーを作成します。ここではfmx-mini-using-cameralibとでもしておきましょうか?Git Remote Repository へpushすることも考えてフォルダー名には空白を入れないのが吉です。RRMはpush先のサーバに応じて適切にレポジトリ名を変更しますけどね。

さてCameralib.zipをダウンロードして、解凍しておきます。中身を上記のフォルダーへcopyします。上記のフォルダーへ行くのは、IDE内部から、project1.exeを右クリックして、

ここからエクスプローラーで表示を選択。

下から上へ、dragしてコピーしても可です。

このようになりますかね。IDE内部へ戻って、ぼつぼつフォームを作りましょう。一応64bitを選択しておきましょう。Debugバージョンでおけです。今は、

こんなふうに640×480のサイズのImage1ColorButton1を配置します。Buttonのカラーはお好みで。Captionを加えるのは、

パレットからttextを選択して、ColorButton1の上にdrag and dropします。上図はその状態。Text1のサイズと位置をColorButton1に合わせて、Textプロパティーには“Capture”とか。さらにText1->HitTestをFalseに。これをやらないと、クリックイベントが下のボタンに透過しません。

で、ColorButton1をダブルクリック。関数の中身に、以下をpaste。

void __fastcall TForm1::ColorButton1Click(TObject *Sender)
{
	void* data;
	long    size;

	filecount = 1;

	TMemoryStream* ImageStream = new TMemoryStream();

	camera->TakePictureToStream();


	TBitmap *bitmap = new TBitmap();

	bitmap->LoadFromStream(ImageStream);
	Image1->Bitmap->Assign(bitmap);         // FMX

	delete ImageStream;

}

cameralib.hをインクルードして、ここまでで。Unit1.cppの冒頭は、

#include <fmx.h>
#pragma hdrstop

#include "cameralib.h"

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.fmx"
TForm1 *Form1;
Camera* camera;
extern int filecount;
int Live=0;


 EdsError EDSCALLBACK ProgressFunc(EdsUInt32 inPercent, EdsVoid* inContext, EdsBool* outCancel)
{

	return EDS_ERR_OK;
}

void UpdateProgressBar(unsigned long value)
{

}


//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	camera = new Camera();

}

さてcanonとnikonからsdkで提供されているヘッダを追加します。結果は、

このようになります。これらのヘッダー群とライブラリをプロジェクトに追加します。

project1.exeを右クリックして、

ここで追加

ヘッダーファイルを選んでheadersというフォルダーをダブルクリック。

全部選択するので、クリックして、一番下でshiftクリック。その状態が上図。ここで”開く”。次は、静的ライブラリファイル

二つとも選んで開く。一度コンパイルしてみましょう。runせずにbuildだけならば、shift-F9

エラー出ました。これは、project1.exeを右クリックして

一番下の“オプション”を選択。

左側のペインの一番上を選択。

のようにC++(共有オプション)->_TCHARのマップ先をcharに変更して保存。その他ダミーのcallback関数も宣言だけしておいて、Unit1.cppは、

//---------------------------------------------------------------------------

#include <fmx.h>
#pragma hdrstop

#include "cameralib.h"

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.fmx"
TForm1 *Form1;
Camera* camera;
extern int filecount;
int Live=0;


 EdsError EDSCALLBACK ProgressFunc(EdsUInt32 inPercent, EdsVoid* inContext, EdsBool* outCancel)
{

	return EDS_ERR_OK;
}

void UpdateProgressBar(unsigned long value)
{

}


//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	camera = new Camera();

}
//---------------------------------------------------------------------------



void __fastcall TForm1::ColorButton1Click(TObject *Sender)
{

	filecount = 1;

	TMemoryStream* ImageStream = new TMemoryStream();

	camera->TakePictureToStream();


	TBitmap *bitmap = new TBitmap();

	bitmap->LoadFromStream(ImageStream);
	Image1->Bitmap->Assign(bitmap);         // FMX

	delete ImageStream;

}

これでコンパイルはできました。edsdk.dllを実行ファイルと同じ階層に置きます。VCLの時は、

 	void* data;
	long    size;

	filecount = 1;

	TMemoryStream* ImageStream = new TMemoryStream();

	camera->TakePictureToStream();


	data = camera->getbuffer();
	size = camera->getsize();

	ImageStream->WriteBuffer(data,size);
	ImageStream->Position = 0;

	Image1->Picture->LoadFromStream(ImageStream);
	delete ImageStream;

でしたが、FMXでは


	filecount = 1;

	TMemoryStream* ImageStream = new TMemoryStream();

	camera->TakePictureToStream();


	TBitmap *bitmap = new TBitmap();

	bitmap->LoadFromStream(ImageStream);
	Image1->Bitmap->Assign(bitmap);         // FMX

	delete ImageStream;

となって、TakePictureToStream以降が少し簡略になりますが、TBitmap介してるので同じようなものかな?これはVCLとFMXとでTImageの扱いが違うためで、Cameralibに責任はありません。

動かして見ましょうかね。canonのカメラをつないで、F9Captureすると、

動いているようですね。CanonNikonのカメラを制覇したつもりは毛頭ないですけど、次はSonyですかね。SDKと実機があればなんとかなるかもです。ただし、個人は相手にしていないかも…..。

法人向けと書いてあるやん。残念。

コメント