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() の幅、高さ、色深度は、必要な数値に変更してください。

SDL2

Posted by sirius