ビットマップの合成(アルファブレンド)

今回は、ビットマップ同士の画像合成をやってみます。これは、ある画像のビットマップに別のビットマップを重ねてちょうど浮き上がってくるような感じで表示する効果です。

ピクセルを混ぜ合わせる

ビットマップを合成する時、考えられる方法としてはまず一定の割合で画像の各ピクセルを「混ぜる」方法があります。別の言いかたをすれば、重ね合わせるビットマップの「透明度」を指定する、とも言えるでしょう。

下地となるビットマップ(ビットマップ1)に別のビットマップ(ビットマップ2)を透明度(アルファ値)を下げながら重ねて行くと、少しずつビットマップ2が「浮かび上がって」来るように見えるわけです。
ビットマップを混ぜ合わせる(アルファブレンド)には、画像の各ピクセルの色情報であるRGBを一定の割合で合成して行けば良いでしょう。例えば、ビットマップ1(lpBMP[0])とビットマップ2(lpBMP[1])のピクセル(x, y)を7:1の割合で混ぜるなら以下のようになります。

  *(lpBMP[0]+y*dwLength+x*3)=(*(lpBMP[0]+y*dwLength+x*3)*7+
    *(lpBMP[1]+y*dwLength+x*3))/8; /* 青成分 */

  *(lpBMP[0]+y*dwLength+x*3+1)=(*(lpBMP[0]+y*dwLength+x*3+1)*7+
    *(lpBMP[1]+y*dwLength+x*3+1))/8; /* 緑成分 */

  *(lpBMP[0]+y*dwLength+x*3+2)=(*(lpBMP[0]+y*dwLength+x*3+2)*7+
    *(lpBMP[1]+y*dwLength+x*3+2))/8; /* 赤成分 */

ビットマップ全体を合成する処理は、この処理をビットマップの全ピクセルに行うだけです。そして、この合成処理を何度か繰り返せば、ビットマップ1にビットマップ2が浮かび上がってくるように見えます。ただし、このままだとビットマップ1が少し残ってしまうので、何度か処理を繰り返したらビットマップ2を上書きした方が良いでしょう。

  void mixBMP(void) { /* ビットマップを混ぜ合わせる */

      DWORD i,j;

      for (i=0;i<dwHeight;i++)
          for (j=0;j<dwWidth;j++) {

              *(lpBMP[0]+i*dwLength+j*3)=(*(lpBMP[0]+i*dwLength+j*3)*7+
                *(lpBMP[1]+i*dwLength+j*3))/8; /* 青成分 */

              *(lpBMP[0]+i*dwLength+j*3+1)=(*(lpBMP[0]+i*dwLength+j*3+1)*7+
                *(lpBMP[1]+i*dwLength+j*3+1))/8; /* 緑成分 */

              *(lpBMP[0]+i*dwLength+j*3+2)=(*(lpBMP[0]+i*dwLength+j*3+2)*7+
                *(lpBMP[1]+i*dwLength+j*3+2))/8; /* 赤成分 */

          }

      if (dwCount>20) { /* 最後にビットマップを上書き */

          CopyMemory(lpBMP[0],lpBMP[1],dwLength*dwHeight);

          KillTimer(hwnd,1); /* タイマーストップ */
          fTimer=FALSE;

      }

      InvalidateRgn(hwnd,NULL,FALSE);
      UpdateWindow (hwnd); /* 再描画 */

      dwCount++; /* 処理回数カウンタ更新 */

  }

プログラム

プログラムソース表示

実行ファイル、あるいはプロジェクトと同じディレクトリにビットマップファイルを2つ(ファイル名はtest1.bmp、test2.bmp)用意しておいてください。

プログラムを起動すると、まずビットマップファイルを読み込みtest1.bmpを表示します。その後「合成開始」ボタンをクリックするとタイマーを起動しtest2.bmpを重ね合わせ処理していくので、ビットマップが浮かび上がってくる様子を確認しましょう。
なお、ビットマップは2つとも同じ大きさの24ビットフルカラービットマップにしてください。


プログラミング資料庫 > DIB/Waveによる音声画像処理実験室