4. Cameralibの構築とテストプログラムのbuild
前記事で入手したCanonとNikonのアーカイブをまず展開します。筆者が用意したwrapperのヘッダと静的ライブラリを固めたzipを下記リンクからダウンロードして、展開してください。
“Cameralib64” をダウンロード cameralib64.zip 53.04 KBcameralib64.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での例は次回に。
コメント