シミュレーション屋のためのOpenGL入門 (画像ファイルに落す)

シミュレーション屋のOpenGL入門

画像ファイルに落す

1999.7.5

出て来た絵は画像ファイルに落としたいものです (この辺のことがマニュアル本にはちゃんと書いてないのです)。 ここでは絵の画像ファイル(ppm形式)への落し方を説明します。 なお、ここに書いてあることは 松田裕也氏に 教わったものです。

実際に絵を描いている関数に以下のようなものを挿入します。 具体的にはglutSwapBuffers();のすぐ下辺りです。 緑色で書いた番号は説明の便宜上付けたもので 実際のプログラムには書いてはいけません。

void display()
{

 1: int pix_i, pix_j, pix_k;
 2: FILE *ppmf;
 3: GLubyte piximage[PIXSIZE_Y][PIXSIZE_X][3];

 4: glReadPixels(0, 0, PIXSIZE_X, PIXSIZE_Y, GL_RGB, GL_UNSIGNED_BYTE, piximage);

 5: ppmf=fopen("test.ppm","w");
 6: fprintf(ppmf,"P6\n");
 7: fprintf(ppmf,"%d %d\n",PIXSIZE_X,PIXSIZE_Y);
 8: fclose(ppmf);
 9: ppmf=fopen("test.ppm","ab");
10: fputc(50,ppmf);
11: fputc(53,ppmf);
12: fputc(53,ppmf);
13: fputc(10,ppmf);

14: for(pix_j=0;pix_j<PIXSIZE_Y;pix_j++)
15:   for(pix_i=0;pix_i<PIXSIZE_X;pix_i++)
16:      for(pix_k=0;pix_k<3;pix_k++)
17:        fputc(piximage[PIXSIZE_Y-1-pix_j][pix_i][pix_k],ppmf);
18: fclose(ppmf);

}  /* display end */
解説
1〜3行目:変数の宣言。 piximageという配列に一時的に画像が格納されます。 PIXSIZE_X、PIXSIZE_Y は画像のサイズです。 直接値を書き込むなり、#defineで定義するなどしておいて下さい。
4行目:描かれている画像を配列に取り込みます。 したがって、同時に画面にも表示をしているなら、この命令のすぐそばに glFlush(); がなければなりません。 意味は画像の左下(0, 0)のピクセルから幅PIXSIZE_X、高さPIXSIZE_Yの画像の RGBデータ(各符号無し8ビット)をpiximageという配列に読み込むということです。
5〜18行目:配列に取り込んだ画像をppm形式でファイルに落している部分です ("test.ppm"というファイルに落すことにします)。
6行目:おまじない(バイナリのカラーppm形式だと言っている。 全部ASCII形式で出力したい人はP3にします)
7行目:画像のサイズ。
10〜13行目:おまじない(255色であると言っている)
14〜17行目:画像をファイルに落している部分。 glReadPixelsは左下から右上へ画像を読み込みますが、 ppm形式では左上から右下の順番なので入れ換えています。 RGB3色を並べて出力します。

落した画像ファイルからアニメーションを作る方法は別の機会に紹介します。

[目次に戻る]


岩瀬康行( iwase@sci.hiroshima-u.ac.jp)