C言語でグラフィックス 目次へ 
 前へ 【5】ビットマップ画像 次へ 

 標準的な画像ファイルの形式であるビットマップファイル(bmp)をGWウィンドウに描画する方法を学習する。

(1)ビットマップの描画

◆サンプルプログラム 〔bitmap11.c〕
 GWウィンドウに描画するため、Windows付属のペイントブラシなどでビットマップファイルを作成する。画像のサイズは幅、高さともに50ピクセルとする。

 作成例 ファイル名
 fig1.bmp

 ビットマップのファイル名は「fig1.bmp」とし、プログラムファイルと同じフォルダに保存しておく。

#include <GrWin.h>

int main(void)
{
    int     width = 640, height = 400;

    GWopen(0);
    GWsize(-5, &width, &height);
    GWsize(-3, NULL, NULL);
    GWvport(0.0, 0.0, (float)width / (float)height, 1.0);
    GWindow(0.0, 0.0, (float)width - 1.0, (float)height - 1.0);
/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */
    GWclear(-1);
    GWloadbmp(1, "fig1.bmp");                   /* ビットマップファイル読み込み */
    GWsetbmp(1, 50.0, 50.0, 1, 1, 0);           /* ビットマップファイル設定 */
    GWputbmp(1, 100.0, 100.0, 7);               /* ビットマップファイル描画 */
/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */
    GWquit();
    return 0;
}
int GWloadbmp(int ビットマップ番号, char *ファイル名);
ビットマップファイル(*.bmp)を読み込み、ビットマップ番号に登録する。一度登録されたビットマップはビットマップ番号により何度でも利用することができる。
・ビットマップ番号は、1以上の整数を指定する。0を指定すると未使用のビットマップ番号が使われ、その番号は返却値として得られる。
・ファイル名は、ビットマップのファイル名を指定する。プログラム(実行ファイル)と同じフォルダに保存するか、絶対パスで指定する。
返却値として、登録されたビットマップ番号が返却される。読み込みや登録に失敗したときは0が返却される。


int GWsetbmp(int ビットマップ番号, float 幅, float 高さ, int 混合モード, int 透明モード, int 基準点);
ビットマップ番号で登録されたビットマップ画像を描画するときの属性を設定する。
・ビットマップ番号は、GWloadbmp関数で登録されたビットマップ画像番号を指定する。
・幅と高さは、ビットマップ画像の大きさをワールド座標系で指定する。
・混合モードは、1とする。
・透明モードは、次のとおりである。
   0 … 不透明モード(ビットマップは矩形で表示される)
   1 … 白を透明色とする(デフォルト)
   1以上 … 透明色の論理色番号値 + 2 (例. 2 => 黒)
・基準点は、次のとおりである。
0 … 中央 (デフォルト) 1 … 左下 2 … 右下
3 … 右上 4 … 左上 5 … 左
6 … 下 7 … 右 8 … 上


int GWputbmp(int ビットマップ番号, float X, float Y, int 描画フラグ);
ビットマップ番号で登録されたビットマップ画像を座標(X, Y)に描画する。
・ビットマップ番号は、GWloadbmp関数で登録されたビットマップ画像番号を指定する。
・描画フラグは、ビットの重みで指定する。
   0ビット目 … 1=描画する/0=描画しない
   1ビット目 … 背景を保存1=する/0=しない
   2ビット目 … 背景を復元1=する/0=しない

 実行すると、座標(100, 100)の位置にビットマップ画像が描画される。基準点を0=中央としているので、ビットマップ画像の中央が座標(100, 100)である。

 サンプルでは、ビットマップ番号を1としているが、GWloadbmp関数でビットマップ番号に0を指定して、割り当てられたビットマップ番号を変数で管理する方が重複等の間違いがなくて良いだろう。

 

◆サンプルプログラム 〔bitmap12.c〕
 ビットマップ番号を変数で受け取り、画像を描画する。整数(int)型変数bnを宣言しておく。

/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */
    GWclear(-1);
    bn = GWloadbmp(0, "fig1.bmp");
    GWsetbmp(bn, 50.0, 50.0, 1, 1, 0);
    GWputbmp(bn, 100.0, 100.0, 7);
/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */

 実行すると、前のサンプルと同じようにビットマップ画像が描画される。

 

◆サンプルプログラム 〔bitmap13.c〕
 ビットマップ画像を座標(100, 100)に描画し、何かキーが押されたとき、さらに座標(200,200)にも同じ画像を描画する。

#include <GrWin.h>

int main(void)
{
    int     width = 640, height = 400;
    int     bn;

    GWopen(0);
    GWsize(-5, &width, &height);
    GWsize(-3, NULL, NULL);
    GWvport(0.0, 0.0, (float)width / (float)height, 1.0);
    GWindow(0.0, 0.0, (float)width - 1.0, (float)height - 1.0);
/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */
    GWclear(-1);
    bn = GWloadbmp(0, "fig1.bmp");
    GWsetbmp(bn, 50.0, 50.0, 1, 1, 0);
    GWputbmp(bn, 100.0, 100.0, 7);              /* 描画 */
    GWkybrd(NULL, NULL, NULL, 2);               /* キー入力待ち */
    GWputbmp(bn, 200.0, 200.0, 7);              /* 描画 */
/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */
    GWquit();
    return 0;
}

 GWkybrd関数の動作に2を指定して、何かキーが押されるまで次の処理に進まないで待つようにしている。
 実行して、ビットマップ画像が座標(100, 100)に描画された後、何かキーを押すと座標(200, 200)の位置にビットマップ画像が描画される。GWputbmp関数の描画フラグを7としているので、キーを押した後、座標(100, 100)の画像は消えて、座標(200, 200)に描画される。

※※ビットマップ画像の描画について※※
 「ウィンドウを閉じます」のダイアログが表示されてから、このダイアログを最初に描画した座標(100, 100)の付近にドラッグで移動すると図のように元の画像が現れる。GWputbmp関数の描画フラグを色糸変更して試してみたがこの現象は改善されなかった。


 前へ 次へ 
 Copyright © 2005 Hiroshi Masuda 

 

 

inserted by FC2 system