発表会などでは、良く赤いレーザーの指示器(スクリーンなどに小さな赤い点を映し出すもの)が使われます。これをビットマップに対してやる時には、一部に「光」を当てる処理になるでしょう。今回は、この光を当てる処理をやってみました。これは、レーザーだけでなくスポットライトなどにも応用できますので、試してみてください。
光を当てる、という事はその部分の光の「成分」を増加させる事を意味します。例えば、ある点のRGBが(128,128,128)だとすると、そこに赤い光を当てるならR成分を増やして(192,128,128)などとするわけです。当然、増やす量を大きくするほど「強い」光になります。ただし、RGBの「最大値」には注意してください。24ビットのDIBなら最大値は255ですから、強い光を当てる時には無条件に255にする、という手もありますね。
以下の例は、ビットマップlpWorkの(iX, iY)から16ピクセル四方に赤い光(R+128)を当てる処理です。
for (i=iY;i<iY+16;i++) /* レーザー照射(周辺部) */ for (j=iX;j<iX+16;j++) if (lpWork[j*3+i*iLength+2]>127) lpWork[j*3+i*iLength+2]=255; else lpWork[j*3+i*iLength+2]+=128;
今回のプログラムは、ビットマップ(48×48以上のフルカラーBMP)を読み込んで赤いレーザーを当てて行きます。まず「読み込み」ボタンでビットマップを読み込んでから、カーソルキーでレーザーの点を動かしてみましょう。
プログラムでは、読み込んだビットマップをバッファ(lpBMP)に保存しておいて、毎回表示用ビットマップ(lpWork)にコピーしその上にレーザーを重ねてから表示しています。