SDL2 でスクリーンショットを取る
SDL2 でウィンドウイメージを画像に保存するには、データコピー用のサーフェスを準備して、SDL_RenderReadPixels() 関数でウィンドウイメージのコピーを取得できます。
SDL_RenderReadPixels() 関数は、遅い関数なので、繰り返し処理中に呼び出したり、タイマーのコールバックで使うと、イベントにキューが溜まり、ウィンドウを閉じられなくなったりしてしまいます。使用する状況に注意する必要があります。
また、SDL_RenderPresent() の直後に呼び出すと、ウィンドウの描画が終わる前にウィンドウの画面イメージをコピーすることになり、乱れることがあります。乱れた場合、この関数を呼び出す前に、SDL_Delay() 関数で待ちを入れると乱れないようになります。私は、320x 240 で保存していますが、50 ミリ秒ほど待ちを入れています。
スクリーンショット保存用に以下のように関数を作って使っています。
void save_bitmaps(SDL_Renderer *r) {
SDL_Surface *s;
static int n = 0;
char file[20];
sprintf(file, "screen%03d.bmp", n++);
s = SDL_CreateRGBSurface(0, 320, 240, 32, 0, 0, 0, 0);
if( s == NULL ) {
printf("Can not create surface\n");
return;
}
SDL_LockSurface(s);
SDL_RenderReadPixels(r, NULL, s->format->format, s->pixels, s->pitch);
SDL_SaveBMP(s, file);
SDL_UnlockSurface(s);
SDL_FreeSurface(s);
}
バッファを作成する SDL_CreateRGBSurface() の幅、高さ、色深度は、必要な数値に変更してください。
ディスカッション
コメント一覧
まだ、コメントがありません