Nanashi-soft○プログラマ専用○Windows gcc SDL○
サーフェスを使わずに自力で画像処理を行い、最後に実画面に描画する際の変換方法です
SDL_CreateRGBSurfaceFromを使ってピクセルデータをサーフェスに変換します
普通に画像データを、Red/8bit、Green/8bit、Blue/8bitの羅列で処理して来たとします
そうすると、RGBRGB...のデータ郡になっているはずです
unsigned char *rgb=malloc(sizeof(unsigned char)*640*480*3); if(rgb == NULL){ return -1; } int i; for(i=0; i < 640*480*3; i+=3){ rgb[i] = 0; rgb[i+1] = 0; rgb[i+2] = 0xff; }
全面青の画像を用意してみました
これがおかしな色で表示されたら失敗と言うわけです
サーフェスに変換する為、まずはピクセルデータ形式に変換します
これは一般的に、符号なしint型を用いて、上位8bitは0の、Red/8bit、Green/8bit、Blue/8bitの形です
unsigned int *pix=malloc(sizeof(unsigned int)* 640 * 480); for(i=0; i < 640*480; i++){ unsigned int r = rgb[i*3]; unsigned int g = rgb[i*3 +1]; unsigned int b = rgb[i*3 +2]; pix[i] = (r << 16) + (g << 8) + b; }
データは青しか入れていませんが、きちんと全色処理していますので、どんな画像でも使えます
生成したピクセルデータをサーフェスに変換します
SDL_Surface *img= SDL_CreateRGBSurfaceFrom((void)pix,640,480,32,640*4,0x00ff0000,0x0000ff00,0x000000ff,0);
引数は、以下のようになります
SDL_CreateRGBSurfaceFrom(「ピクセルデータ」,「横幅」,「高さ」,「色深度」,「横のバイト数」,「赤のマスク」,「緑のマスク」,「青のマスク」、0)
マスク指定があるので、うまくすれば元データをそのまま変換可能です
注意点があるのですが、SDL_CreateRGBSurfaceFromは、正確には変換では無く『ヘッダー追加』です
pixデータを開放してしまうと壊れてしまいます
それと、戻り値を見ると分かるようにポインターですので、使用後は開放するのも忘れてはいけません
SDL_FreeSurface(img);
上記処理を、最終的に実画面に描画して、その後処理まで行う例です
//RGBデータ生成 unsigned char *rgb=malloc(sizeof(unsigned char)*640*480*3); if(rgb == NULL){ return -1; } //とりあえず青で塗りつぶしてみる int i; for(i=0; i < 640*480*3; i+=3){ rgb[i] = 0; rgb[i+1] = 0; rgb[i+2] = 0xff; } //ピクセルデータに変換 unsigned int *pix=malloc(sizeof(unsigned int)* 640 * 480); for(i=0; i < 640*480; i++){ unsigned int r = rgb[i*3]; unsigned int g = rgb[i*3 +1]; unsigned int b = rgb[i*3 +2]; pix[i] = (r << 16) + (g << 8) + b; } //サーフェスを生成 SDL_Surface *img= SDL_CreateRGBSurfaceFrom((void *)pix,640,480,32,640*4,0x00ff0000,0x0000ff00,0x000000ff,0); //実画面にコピーして表示 SDL_BlitSurface(img, NULL, screen, NULL); SDL_UpdateRect(screen, 0, 0, 1280, 720); //サーフェスを破棄 SDL_FreeSurface(img); //ピクセルデータを破棄 free(pix); //RGBデータを破棄 free(rgb);