C++ Builder CE Cameralibの活用

4. Cameralibの構築とテストプログラムのbuild

前記事で入手したCanonとNikonのアーカイブをまず展開します。筆者が用意したwrapperのヘッダと静的ライブラリを固めたzipを下記リンクからダウンロードして、展開してください。

“Cameralib64” をダウンロード cameralib64.zip 53.04 KB

cameralib64.zipを展開したフォルダーは、以下のようになっているはずです。

ここが作業場になります。

まずEDSDK.dllを静的ライブラリに変換します。

ここのEDSDK.dllを二つ上の作業場にコピーします。作業場で何も選択してない状態で右クリック

出てきたメニュー(下図)で“Open Gif bash here”をクリック。これが出てこない場合は、さらにオプションを表示とかなんとかで見つけ出す。出てきたコンソール画面で、

としてmkexpを起動。以前の記事でも使っています。

$ mkexp edsdk.a edsdk.dll

edsdk.aができました。次にヘッダーを取ってきます。

この三つを作業場のheaderへコピー。EDSDKのHeaderは32bit 64bit共通ですから上図のようなパスで見つかるはずです。次にNikonの方ですね。

ここから5個全部のheaderを作業場のheader内部へコピー。さらに下図のCtrlSample.hもコピー。

cameralib->header内部は、

となっているはずです。一つ上の階層は、

さて、簡単なテストプログラムを作ります。って、少し前の記事で”できあがり”のサンプルとして提示したものです。

C++ Builder CEのIDEを起動して、新規VCLプログラムを作成しつつ、フォームは以下の様にします。

サイズが640×480くらいのTImagex1,Tlabelx1,TLabeledEditx1,TButtonx3,TProgressBarx1です。Nameは上図を参考に適当につけてください。Captureは静止画をTImageに表示、Movieはdurationで指定した秒数の動画の記録、Stillは静止画をPC側に保存です。

Unit1.cppは、

#include <vcl.h>
#pragma hdrstop
#include "cameralib.h"
#include <jpeg.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

Camera* camera;
extern int filecount;
int Live=0;


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

	Form1->TransferProgress->Position = inPercent;
	return EDS_ERR_OK;
}

void UpdateProgressBar(unsigned long value)
{
	Form1->TransferProgress->Position = value;
}


//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	camera = new Camera();
	if( camera->TotalCameraCount > 0  ){
		Label1->Caption = camera->GetName();
		Movie->Enabled = true;
        Still->Enabled = true;
	}
	else
		Label1->Caption = "no cameras found";


}
//---------------------------------------------------------------------------
void __fastcall TForm1::MovieClick(TObject *Sender)
{
 	camera->RecordMovie();
	Sleep(1000*(StrToInt(Duration->Text)+1));
	camera->StopMovie();


}
//---------------------------------------------------------------------------
void __fastcall TForm1::StillClick(TObject *Sender)
{
	camera->TakePictureToFile();

}
//---------------------------------------------------------------------------
void __fastcall TForm1::CaptureClick(TObject *Sender)
{
	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);
	//Image1->Refresh();
	delete ImageStream;

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

フォームUnit1.cppの準備ができたら一旦セーブしましょう。適切はフォルダー名を付けましょう。そのフォルダーへ準備したCameralibの中身をコピーします。ターゲットプラットフォームを64bitにしておきましょう。

プロジェクトのフォルダーには、下のような操作でIDEを開いたままで簡単に行けます。

Unit1.cppが空な時点で1回Buildするのが吉かもしれません。ここへcameralibをfolderごとコピー

ここでcameralib内部の静的ライブラリはこの階層(一つ上)に移動しておくのが吉です。でIDEに戻ります。

上記のプロジェクトへの追加から、ヘッダーを選択して、

cameralibのフォルダーをダブルクリック。さらにheaderに入って、

全部を選ぶのですが、ctrl-Aでおけです。で、開く

こんどは静的ライブラリファイルを選択します。

cameralibへ入って、二つの.aファイルを選びます。プロジェクトオプションから、

_TCHARのマップ先はcharで。いよいよBuildですが、nikonのヘッダーでエラーが出たら、

	//typedef signed long int32_t;

とコメントアウト。IDEの起動で以下のエラーの場合には、

EDSDK.dllをbuildしてできているProject1.exeと同じ階層に置きます。(これもあるある。)

こうなればほぼおけ。カメラをつなぎますが、Image1のプロパティーを以下のようにしてください。

で、Captureすると無事

Nikonのカメラを使いたい場合は、バイナリモジュールを用意する必要があります。

これらのファイルをProject1.exeと同じ階層に置いてください。実行例は、

一応動いているようです。FMXでの例は次回に。

コメント