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 の値になります。
0x | xx | rr | gg | bb |
透過型の bitmap では、使用されない最初の 1 バイトをアルファチャンネルとして使用します。しかし、一般的には、RGBA と表現されるように、色情報のあとにアルファ値が置かれます。これに注意しないと透過されません。
ディスカッション
コメント一覧
まだ、コメントがありません