SDL2 で画像データをプログラムに埋め込む

 SDL2 で、画像データをプログラム内に持ち、それを表示してみます。

 空のサーフェスを作成して、そのサーフェスにデータをコピーします。色深度は 32 ビットにします。

画像の RGB データを作成

 今回は簡単にするため、 8 x 8 のサイズのデータを定義します。

Uint32 pixels[] = {
    0x000000ff, 0x000000ff, 0x0000ffff, 0x0000ffff,
    0x000000ff, 0x000000ff, 0x0000ffff, 0x0000ffff,
    0x000000ff, 0x000000ff, 0x0000ffff, 0x0000ffff,
    0x000000ff, 0x000000ff, 0x0000ffff, 0x0000ffff,
    0x000000ff, 0x000000ff, 0x0000ffff, 0x0000ffff,
    0x000000ff, 0x000000ff, 0x0000ffff, 0x0000ffff,
    0x000000ff, 0x000000ff, 0x0000ffff, 0x0000ffff,
    0x000000ff, 0x000000ff, 0x0000ffff, 0x0000ffff,
    0x0000ffff, 0x0000ffff, 0x00ffffff, 0x00ffffff,
    0x0000ffff, 0x0000ffff, 0x00ffffff, 0x00ffffff,
    0x0000ffff, 0x0000ffff, 0x00ffffff, 0x00ffffff,
    0x0000ffff, 0x0000ffff, 0x00ffffff, 0x00ffffff,
    0x0000ffff, 0x0000ffff, 0x00ffffff, 0x00ffffff,
    0x0000ffff, 0x0000ffff, 0x00ffffff, 0x00ffffff,
    0x0000ffff, 0x0000ffff, 0x00ffffff, 0x00ffffff,
    0x0000ffff, 0x0000ffff, 0x00ffffff, 0x00ffffff
};

サーフェスを作成しデータをコピーする

    image = SDL_CreateRGBSurface(0, 8, 8, 32, 0, 0, 0, 0);
    if( image == NULL ) {
        printf("CAn not create surfave\n");
        exit(1);
    }
    SDL_LockSurface(image);
    for(i = 0; i < image->w * image->h; i++ ) {
        *((Uint32 *)image->pixels + i) = pixels[i];
    }
    SDL_UnlockSurface(image);

 このサーフェスを使って表示すればいいです。

表示

 8 x8 にサイズなので小さいですが、中央に表示しました。

アルファ値のあるデータ

 透過させるため、アルファ値のあるデータを使う場合は、サーフェスを作製する際にマスクを指定しないと、透過しないようです。

    image = SDL_CreateRGBSurface(0, 8, 8, 32, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff);

 引数の最後 4 つがマスクです。 R マスク、Gマスク、B マスク、A マスクです。A マスクがアルファ値の位置を表します。

マスク設定

Windows ビットマップのデータ

 Windows のフルカラーのビットマップファイル形式は RGB の生の値を持っているのでプログラムから使いやすい形式です。フルカラーの場合、ピクセル当たり RGB で 24 bit になります。

 しかし、現在はメモリを自由に使える状況にあって、24 bit は中途半端なビット数です。そこで、32 bit のbitmap が使われる傾向にあります。しかし、もともと bitmap にはアルファチャンネルがありません。32 bit にしても、1 バイト分の無駄が発生します。

 空いた 1 バイトをどの様に使うのかは、bitmap を扱うソフトウェア次第です。しかし、アルファチャンネルとして扱うソフトウェアが多いと感じます。

 32bit のビットマップでは、先頭 1 バイトを除いた残りの 3 バイトが RGB の値になります。

0xxxrrggbb
32bit データ

 透過型の bitmap では、使用されない最初の 1 バイトをアルファチャンネルとして使用します。しかし、一般的には、RGBA と表現されるように、色情報のあとにアルファ値が置かれます。これに注意しないと透過されません。

SDL2

Posted by sirius