|
ぼかし処理では、全体に靄がかかったように「やわらかく」なる感じでぼかしてみました。今回は、もう少し「きつい」感じでちょうど滲んで行くような、あるいはピンぼけのような感じを出してみる事にしましょう。 滲み処理と処理時間の測定ぼかし処理では、処理対象のピクセルの色を上下左右4ピクセルの色と混ぜ合わせていました。滲み処理も似たような考え方で実現できますが、今度は混ぜ合わせる範囲を広げ処理対象となるピクセルを中心とする5×5ピクセルのブロック(処理対象のピクセル自身も含む)の色を平均して、それを混ぜ合わせる事にします。
/* ビットマップを作業用領域にコピー */
CopyMemory(lpWork,lpBMP,iWidth*iHeight*3);
for (i=0;i<iHeight;i++) /* 各ピクセルの滲み処理 */
for (j=0;j<iWidth;j++) {
iRed=0; /* R成分の合計 */
iGreen=0; /* G成分の合計 */
iBlue=0; /* B成分の合計 */
n=0; /* 合計されたピクセル数 */
for (ii=-3;ii<4;ii++) /* ブロック内のRGB成分を合計 */
for (jj=-3;jj<4;jj++)
if (j+jj>0 && j+jj<iWidth &&i+ii>0 && i+ii<iHeight) {
iRed+=lpWork[(j+jj)*3+(i+ii)*iWidth*3+2];
iGreen+=lpWork[(j+jj)*3+(i+ii)*iWidth*3+1];
iBlue+=lpWork[(j+jj)*3+(i+ii)*iWidth*3];
n++;
}
/* ブロック平均のピクセルの色と「混ぜ合わせて」にじませる */
lpBMP[j*3+i*iWidth*3]=(lpWork[j*3+i*iWidth*3]+iBlue/n)/2;
lpBMP[j*3+i*iWidth*3+1]=(lpWork[j*3+i*iWidth*3+1]+iGreen/n)/2;
lpBMP[j*3+i*iWidth*3+2]=(lpWork[j*3+i*iWidth*3+2]+iRed/n)/2;
}
また今回のプログラムでは、処理の前後の時間を調べて処理にかかった時間を測定し、表示してみました。 iTime1=GetTickCount(); /* 処理開始前の時間を記録 */ ・ ・ 処理 ・ ・ iTime=GetTickCount()-iTime1; /* 処理にかかった時間を計算 */ プログラム今回のプログラムは、ビットマップファイルを読み込んで表示し、それを滲ませる処理を行います。まず、ビットマップファイルをドラッグ&ドロップするか「読み込み」ボタンで読み込んだ後、「滲み処理」ボタンで滲み処理をかけてみてください。 読み込めるビットマップは、24ビットフルカラーで幅が4の倍数ピクセルのものです。 |