BMPファイルのロード - Casio Basicプログラミング
2018/01/08
追記修正 2020/01/17
[C.Basic] [FX / CG]
ビットマップファイルをロードして描画したい。
C.Basic では、ビットマップファイルを呼び出し、ロードして表示することができる。これは純正Caso Basicではできない。
C.Basic のグラフィックス画面は、フル画面モードで最大 384 x 216 ピクセル、標準モードでは 最大384 x 192 ピクセルのビットマップファイルを表示できる。
◆ BmpLoad コマンドでロードする最低限のコード
BMPフォルダにある TEST.BMP をロードする例。
(サンプルプログラム)
BmpLoad("/BMP/TEST")
ビットマップファイルの拡張子 .BMP を省略できる。画像の左上が座標 (0.0) になるように描画される。
純正Casio Basic はテキスト画面とグラフィックス画面の2つを区別して出力する仕様で、テキスト系コマンドを実行するとテキスト画面に出力、グラフィックス系コマンドを実行するとグラフィックス画面に描画する。そしてテキスト系とグラフィックス系のコマンドの出力先を同じ画面にできない仕様になっている。
一方、C.Basic では、出力先を自由に指定でき、グラフィックス画面にテキスト系コマンドを出力したり、テキスト系コマンドをグラフィックス画面出力可能。テキスト系コマンドとグラフィックス系コマンドを同じ画面に出力することも可能。
描画するビットマップ画像の左上の座標を指定することもできる。
(サンプルプログラム)
BmpLoad("/BMP/TEST.BMP"),0,0
TEST.BMP の画像の左上を 座標(0.0) に指定して描画する。
純正Casio Basicのグラフィックス描画領域は 379 x 187 ピクセルであるが、C.Basic の標準モードでは 384 x 192 ピクセルで、さらにフル画面モードでは 384 x 216 ピクセルになっている。標準モードの画面の左上の座標は (0, 0) で、フル画面モードでの画面の左上の座標は (0, -24) となる。
そこで、最大 384 x 192 ピクセルのビットマップファイルをロードし、画面左上に併せて描画するには、上の2つの書式が使える。
一方、フル画面モードで最大 384 x 216 ピクセルのビットマップファイルをロードして表示するには、フル画面全体をクリアする_ClrVram コマンド実行することでロード先をフル画面に切替えた後、フル画面の左上の座標 (0, -24) を画像の左上に指定することもできる。
(サンプルプログラム)
_ClrVram
BmpLoad("/BMP/TEST.BMP"),0,-24,0
左上の座標の設定に続いて、0 を指定しているが、これはロード先を背景だけに指定するパラメータ。
なお、これまでのサンプルプログタムではロード先にテキスト画面かグラフィックス画面かを明示的に指定していない。
出力先を指定する Screen コマンドを使い、Screen.T とすればテキスト画面、Screen.G とすればグラフィックス画面が指定される。
グラフィックス画面をフル画面にし、その背景のみに 384 x 216 ピクセルのビットマップファイル (TEST.BMP) を描画するコードは以下のようになる。
(サンプルプログラム)
Screen.G:_ClrVram
BmpLoad'/BMP/TEST"),0,-24,0
ビットマップファイルの拡張子を省略している。
◆ ロードするビットマップファイルのファイル名を入力させる例
フル画面モードで最大 384 x 216 ピクセルのビットマップファイルをロード&描画する。
(サンプルプログラム)
'= Key-in file name
"_ _ _ _.BMP"→Str 1
"Input file name"?Str 1
'= Load BMP file
Screen.G:_ClrVram
BmpLoad(Str 1),0,-24,0
なお、ビットマップファイルは予めストレージメモリに転送しておく。呼び出す際はフォルダに対応していて、例えばBMPフォルダにある TEST.BMP をロードするには、この用例では /BMP/TEST.BMP と入力する。
入力時にエラーがあると、エラーメッセージと共にプログラムが中断する。そこで、エラー処理を追加してプログラムが中断しないようにする。
◆ エラー処理を含んだ BMPファイルのロード&描画する例
(サンプルプログラム) ダウンロード: LOADBMP.g3m
'==BMP file loading routine==
' Ver 1.0 Krtyski//e-Gadget
'= Key-in file name <ブロック1>
' file name→Str _1
"_ _ _ _.BMP"→Str 1
"Input file name"?Str 1
'= Check file existance <ブロック2>
' exist: S=file size
' not exist: S=0 & Return -1
IsExist(Str 1)→S
If S=0:Then
"Not exist"
Return -1
IfEnd
'= Check BMP file format <ブロック3>
' not BMP file: Return -1
""→Str 2 [2020/01/17 追記: C.Basic for CG Ver 1.43での仕様変更のため]
{3,1}→Dim Mat θ.B
Load(Str 1)→Mat θ
For 1→I To 2
Mat θ[I]→Mat r
Next
0→Mat r
ClrMat θ
If StrCmp(Str 2,"BM"):Then
"Not exist"
Return -1
IfEnd
'= Load BMP file in <ブロック4>
' back ground of text screen
Screen.G:_ClrVram
BmpLoad(Str 1),0,-24,0
<ブロック1>
ビットマップファイルをキー入力させる。
入力したファイル名を Str 1 に格納。
<ブロック2>
入力したファイル名 (Str 1) がフォルダ内に存在するかどうかを IsExist コマンドで調べる。
IsExist はファイルが見つかればそのファイルサイズ、見つからなければ 0 を返す。
そこで、S が 0 ならば Not exist と表示して、Return -1 を実行して、プログラム終了。
このルーチンを Gosub や Prog コマンドで呼び出す場合は、-1 が返るのでエラー判定可能。
<ブロック3>
見つかったファイルがビットマップファイルかどうかを判定する。
ビットマップファイルはファイルの最初の2バイトが BM になっていることを利用。
この部分は、g3mファイルの場合は60バイト目からのファイル名を調べるなどに応用できる。
最初の2バイトが BM かどうかは、StrCmp コマンドで判定。一致すれば 0 を返し、そうでない時は 1 か -1 を返すので、0でない時 Not exist と表示して Return -1 を実行しプログラムを終了する。
<ブロック4>
ビットマップファイルをロードし、テキスト画面の背景に表示する。
ここまで来れば、入力したファイル名がビットマップファイルなので、BmpLoad コマンドでロードする。
BmpLoad(Str 1),0,-24,0 は、Str 1 のビットマップファイルをフル画面モードの左上の座標 (0, -24) から背景として描画する。
応援クリックをお願いします。励みになるので...