サーフェスを画像として保存

2021年9月26日

SDL_imageでサーフェスを画像として保存するには、下記の関数を使用します。

IMG_SavePNG関数

サーフェスをpngファイルとして保存します。

宣言

int IMG_SavePNG( SDL_Surface* surface, const char* file );

引数

surfaceサーフェスのアドレスです。
file保存するファイルのパスです。

戻り値

保存に成功すると「0」を返し、失敗すると「エラーコード( 負の数 )」を返します。

IMG_SaveJPG関数

サーフェスをjpgファイルとして保存します。

宣言

int IMG_SaveJPG( SDL_Surface* surface, const char* file, int quality );

引数

surfaceサーフェスのアドレスです。
file保存するファイルのパスです。
quality品質値です。この値を小さくすると画質を落とし、ファイルサイズを小さくできます。
この値の範囲は「0」から「100」です。

戻り値

保存に成功すると「0」を返し、失敗すると「エラーコード( 負の数 )」を返します。

SDL_SaveBMP関数

サーフェスをbmpファイルとして保存します。

宣言

int SDL_SaveBMP( SDL_Surface* surface, const char* file );

引数

surfaceサーフェスのアドレスです。
file保存するファイルのパスです。

戻り値

保存に成功すると「0」を返し、失敗すると「エラーコード( 負の数 )」を返します。

サンプルプログラム

#include <SDL_image.h>
#include <SDL_ttf.h>

TTF_Font*       g_font                          = nullptr;
SDL_Surface*    g_shaded_string_surface         = nullptr;
SDL_Surface*    g_anti_aliased_string_surface   = nullptr;

bool Initialize();
void Finalize();
bool CreateStringSurfaces();

int main( int argc, char* argv[] )
{
    if ( !Initialize() ) 
    {
        Finalize();
        return -1;
    }

    IMG_SavePNG( g_anti_aliased_string_surface  , u8"string.png" );
    IMG_SaveJPG( g_shaded_string_surface        , u8"string.jpg", 100 );
    SDL_SaveBMP( g_anti_aliased_string_surface  , u8"string.bmp" );

    Finalize();

    return 0;
}

bool Initialize() 
{
    if ( TTF_Init() == -1 ) 
    {
        SDL_Log( u8"SDL_ttfの初期化処理に失敗しました。エラーメッセージ: %s", TTF_GetError() );
        return false;
    }

    g_font = TTF_OpenFont( u8"arial.ttf", 32 );

    if ( g_font == nullptr ) 
    {
        SDL_Log( u8"フォントの読み込みに失敗しました。エラーメッセージ: %s", TTF_GetError() );
        return false;
    }

    if ( !CreateStringSurfaces() ) return false;

    return true;
}

void Finalize() 
{
    if ( g_shaded_string_surface        != nullptr ) SDL_FreeSurface( g_shaded_string_surface );
    if ( g_anti_aliased_string_surface  != nullptr ) SDL_FreeSurface( g_anti_aliased_string_surface );
    if ( g_font                         != nullptr ) TTF_CloseFont  ( g_font );

    TTF_Quit();
}

bool CreateStringSurfaces() 
{
    auto string_color   = SDL_Color();
    string_color.r      = 0;
    string_color.g      = 255;
    string_color.b      = 255;
    string_color.a      = 255;

    auto shaded_color   = SDL_Color();
    shaded_color.r      = 100;
    shaded_color.g      = 100;
    shaded_color.b      = 100;
    shaded_color.a      = 255;

    g_shaded_string_surface         = TTF_RenderUTF8_Shaded ( g_font, u8"shaded string"         , string_color, shaded_color );
    g_anti_aliased_string_surface   = TTF_RenderUTF8_Blended( g_font, u8"anti aliased string"   , string_color );

    if ( g_shaded_string_surface == nullptr ) 
    {
        SDL_Log( u8"網掛けをかけて文字列を描画したサーフェスの作成に失敗しましたエラーメッセージ: %s", TTF_GetError() );
        return false;
    }

    if ( g_anti_aliased_string_surface == nullptr ) 
    {
        SDL_Log( u8"アンチエイリアスをかけて文字列を描画したサーフェスの作成に失敗しました。エラーメッセージ: %s", TTF_GetError() );
        return false;
    }

    return true;
}

※ このプログラムではSDL_ttfを併用しています。

参考ページ