リモートセンシングソフトウェア開発に関するプログラミング技術の紹介サイトです

プログラミング

Borland Turbo C++

 ここで説明するプログラミング開発ツールは、「Turbo C++ Explorer」を使ったものです。
 このツールは、Windows用のインターフェースが簡単に記述でき、また、ある特定のコードをマスターすれば画像処理ソフトウェアを簡単に開発できるプログラム開発ツールです。
 管理者はインターネット上に記載されているQ&Aを見て、数週間でWindows上での画像処理ソフトウェアの基礎をマスターしました。
 ただ残念なことに、無料で使用できた「Turbo C++ Explorer」は、2009年8月より、公開を中止しました。このため、Explorerを持っていない方は、有料版の「Builder」を対象としたものになります。
 当講座では、主に画像ファイルの取り扱いと画像表示について具体のプログラム例を示します。


ビットマップファイルの選択

ファイルの選択は、オープンダイアログを使い、次の1行で記述することができます。
if (OpenPictureDialog1->Execute()){ }

【プログラミング例】
// 型宣言を行います。
AnsiString Fname;
char *Fnamec;
// ファイルオープンダイアログの設定を行います。
// 表示タイトルと、表示対象の拡張子を設定(フィルタリング)します。
OpenPictureDialog1->Title = "ファイルを開く";
OpenPictureDialog1->Filter = "BMPファイル (*.bmp) | *.bmp";
// オープンダイアログを表示しファイルを選択します。
if (OpenPictureDialog1->Execute()){
// ファイル名(AnsiString型)を取得します。
 Fname = OpenPictureDialog1->FileName;
// ファイル名(char型)を取得します。
 Fnamec = OpenPictureDialog1->FileName.c_str();
}


ビットマップファイルの表示

ビットマップのファイル名がAnsiStringで定義されたFnameの場合、次の1行で表示することができます。

Image1->Picture->LoadFromFile(Fname);


ビットマップファイル名がimage.bmpの場合、次のようになります。

Image1->Picture->LoadFromFile("image.bmp");


ビットマップファイルを選択して表示する

ビットマップファイルを選択して表示する場合は、上記のプログラミングを組み合わせ次のようになります。

【プログラミング例】
AnsiString Fname;
OpenPictureDialog1->Title = "ファイルを開く";
OpenPictureDialog1->Filter = "BMPファイル (*.bmp) | *.bmp";
if (OpenPictureDialog1->Execute()){
 Fname = OpenPictureDialog1->FileName;
 Image1->Picture->LoadFromFile(Fname);
}


ビットマップファイルの縦横長と1画素当たりのデータサイズの取得

【プログラミング例】
// 型宣言を行います。
WORD buf_i[1];
long Height,Width,BitCount,buf_l[2];
FILE *fr;
// ファイル名file.bmpをオープンします。"rb"はバイナリのリードのことです。
fr = fopen("file.bmp","rb");
// 横と縦の長さを取得します。
fseek(fr,18L,0);
fread(buf_l,4,2,fr);
Width = buf_l[0];
Height = buf_l[1];
// 1画素当たりのデータサイズを取得します。
fseek(fr,28L,0);
fread(buf_i,2,1,fr);
BitCount = buf_i[0];
// オープンしたファイルをクローズします。
fclose(fr);


衛星画像のリーダファイルのデータ表示

 ファイル先頭から20バイト目のF10.6のデータを表示する場合の例を記載します。
実数のため、文字列を実数に変換する「atof」を使用します。なお、文字列を整数に変換する場合は、「atoi」を使用します。      

【プログラミング例】
// atof関数を使用するため事前に「stdlib.h」をincludeしておいてください。
// 型宣言を行います。F10.6という10桁の数のため、a[10]という文字列で10ヶの配列を型宣言します。
char a[10];
float data;
FILE *fr;
// ファイル名file_nameをオープンします。"rb"はバイナリのリードのことです。
fr = fopen("file_name","rb");
// 20バイト目にオフセットします。
fseek(fr,20L,0);
// 10ヶの1バイトのバイナリデータを aの文字列として読み込みます。
fread(a,1,10,fr);
// 文字列 aを実数に変換します。
data = atoi(a);
printf("%10.6f \n",data);
// オープンしたファイルをクローズします。
fclose(fr);


RAWデータの読み込み

 横幅(ピクセル数)と縦幅(ライン数)が既知のとき、1バイトRAWデータの読み込みは、次のように行います。本プログラム例では、横幅をWidth、縦幅をHeightとします。      

【プログラミング例】
// 型宣言を行います。
unsigned char buf[2000];
int y,Width,Height;
long offset;
FILE *fr;
// ファイル名file_nameをオープンします。"rb"はバイナリのリードのことです。
fr = fopen("file_name","rb");
// fseekのオフセットを設定します。
offset = 0L;
for(y=0 ; y<Height ; y++){
// データを読み込みます。データはbuf配列に格納されます。
 fseek(fr,offset,0);
 fread(buf,1,Width,fr);
// fseekで使用するオフセットを変更します。
 offset = offset + Width;
}
// オープンしたファイルをクローズします。
fclose(fr);