C言語による描画(BMP編)
ラスターグラフィックの描画は,無圧縮BMP形式が一番簡単である。簡単なライブラリ:
code:grBMP.c
void putbytes(FILE *f, int n, unsigned long x) /* xの末尾からnバイト出力 */
{
while (--n >= 0) {
fputc(x & 255, f); x >>= 8;
}
}
void gr_dot(int x, int y, long color) /* 点(x,y)を色colorで塗る */
{
if (x >= 0 && x < XMAX && y >= 0 && y < YMAX)
}
void gr_clear(long color) /* 色 color でクリア */
{
int x, y;
for (x = 0; x < XMAX; x++)
for (y = 0; y < YMAX; y++)
gr_dot(x, y, color);
}
void gr_BMP(char *filename) /* BMPファイル出力 */
{
int x, y;
FILE *f = fopen(filename, "wb");
fputs("BM", f); /* ファイルタイプ */
putbytes(f, 4, XMAX * YMAX * 4 + 54); /* ファイルサイズ */
putbytes(f, 4, 0); /* 予約領域 */
putbytes(f, 4, 54); /* ファイル先端から画像までのオフセット */
putbytes(f, 4, 40); /* 情報ヘッダサイズ */
putbytes(f, 4, XMAX); /* 画像の幅 */
putbytes(f, 4, YMAX); /* 画像の高さ */
putbytes(f, 2, 1); /* プレーン数(1) */
putbytes(f, 2, 32); /* 色ビット数 */
putbytes(f, 4, 0); /* 圧縮形式(無圧縮) */
putbytes(f, 4, XMAX * YMAX * 4); /* 画像データサイズ */
putbytes(f, 4, 3780); /* 水平解像度(dot/m) */
putbytes(f, 4, 3780); /* 垂直解像度(dot/m) */
putbytes(f, 4, 0); /* 格納パレット数 */
putbytes(f, 4, 0); /* 重要色数 */
for (y = 0; y < YMAX; y++)
for (x = 0; x < XMAX; x++)
putbytes(f, 4, gr_screenyx); /* 画像データ */ fclose(f);
}
試してみよう:
code:test.c
int main(void)
{
int x, y;
for (x = 0; x < XMAX / 2; x++)
for (y = 0; y < YMAX / 2; y++)
gr_dot(x, y, GREEN);
for (x = XMAX / 2; x < XMAX; x++)
for (y = 0; y < YMAX / 2; y++)
gr_dot(x, y, BLUE);
for (x = 0; x < XMAX / 2; x++)
for (y = YMAX / 2; y < YMAX; y++)
gr_dot(x, y, RED);
for (x = XMAX / 2; x < XMAX; x++)
for (y = YMAX / 2; y < YMAX; y++)
gr_dot(x, y, WHITE);
gr_BMP("test.bmp");
return 0;
}
これで test.bmp というファイルに画像が描き出される。無圧縮なのでサイズが大きい。これをPNGなどの圧縮形式に変換して利用する。