フェードインとフェードアウトの画像処理

フェードアウト、フェードインとは、画面の転換時に画面全体が徐々に暗くなって画面が変わったり、暗い画面に徐々に画面が浮かび上がってくる効果です。プログラムの中でカラーテーブルを使うと、こうしたフェードインやフェードアウトの画像処理を効率的に実装することができます。
カラーテーブル(パレット)を使うため、画像素材で使用可能な色数に制限は出ますが、アニメ調の画像を使用する際には効果的に使えるかもしれませんね。

明るさを変化させるには

まず、256段階グレースケールのビットマップを考えてみましょう。このカラーテーブルは0がRGBで(0、0、0)、1が(1、1、1)、2が(2、2、2)....と続いて最後の255が(255、255、255)となるはずですね。このビットマップを「暗く」するには、言い換えればRGBの値を全体に「小さく」するにはどうすれば良いでしょうか?

単純な答えとしては、「カラーテーブルの値を小さくしていく」というのがあります。つまり、カラーテーブルのRGB値をひとつづつ減らしていくのです。これで行くと、カラーテーブル0が(ー1、ー1、ー1)、1が(0、0、0)、2が(1、1、1)、255が(254、254、254)となりそうですが、カラーテーブルの値は0ー255なので0未満の値は0にします。そして、これを255回続けるとカラーテーブルがすべて(0、0、0)になって画像が真っ暗になります。逆に、画像全体を明るくする時はRGBを増やしていって、最後にはRGBがすべて(255、255、255)、つまり真っ白になります。
ただ、プログラムの処理で毎回カラーテーブルを書き換えるのはちょっと効率が悪いので、あらかじめカラーテーブルの配列を作っておくと良いでしょう。すべて(0、0、0)の真っ暗のカラーテーブルから、すべて(255、255、255)の真っ白なカラーテーブルまで、512個のカラーテーブルを含んだ配列になります。

・カラーテーブルの配列(Palette[512])を作るプログラム
  for (i=-255;i<1;i++)
      for (j=0;j<256;j++)
          if (i+j>=0) {

              Palette[i+255][j].rgbRed=i+j;
              Palette[i+255][j].rgbGreen=i+j;
              Palette[i+255][j].rgbBlue=i+j;

          } else {

              Palette[i+255][j].rgbRed=0;
              Palette[i+255][j].rgbGreen=0;
              Palette[i+255][j].rgbBlue=0;

          }

  for (i=256;i<<512;i++)
      for (j=0;j<<256;j++)
          if ((i-256)+j<256) {

              Palette[i][j].rgbRed=i-256+j;
              Palette[i][j].rgbGreen=i-256+j;
              Palette[i][j].rgbBlue=i-256+j;

          } else {

              Palette[i][j].rgbRed=255;
              Palette[i][j].rgbGreen=255;
              Palette[i][j].rgbBlue=255;

          }

こうしてカラーテーブルを作ったら、フェードアウトの時にはだんだん「暗い」カラーテーブルに換えて行き、フェードインならだんだん「明るい」カラーテーブルに換えて行きます。カラーテーブルを換えるタイミングは、タイマを使ったり適当なウエイトを入れたメインループ内で換えたり、という方法が考えられます。また、RGBを増減する値は別に1でなくても良いわけで、このあたりはカラーテーブルを換える周期と併せていろいろ試してみましょう。

プログラム

 今回のプログラムでは、20msのウエイトを入れたメインループ内でカラーテーブルを変更しています。実行するとグレースケールのビットマップが表示され、「開始」ボタンを押すと画面が暗くなってフェードアウトするようにしました。

プログラムソース表示

画像が真っ暗になると今度はだんだんに明るくなり、真っ白になるとまた暗くなって行く。以降はこの繰り返しなので、だんだんとビットマップが「浮かび上がって」きたり、「かき消されて」行く様子を確認してください。


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