Nanashi-softプログラマ専用Windows gcc SDL


◇Windowsでgcc+SDL -RGBデータをサーフェスにする-

サーフェスを使わずに自力で画像処理を行い、最後に実画面に描画する際の変換方法です
SDL_CreateRGBSurfaceFromを使ってピクセルデータをサーフェスに変換します

○RGBデータを用意

普通に画像データを、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);



TOPプログラマ専用Windows gcc SDL