|
モノクロの絵や写真には独特の雰囲気があるので、特殊効果として良く使われますね。ゲームやマルチメディア作品でも回想シーンや叙情的イベントなどで使われ、効果的に使うと極めて印象深いシーンを作る事が出来るようです。 色の表現方法と単色化 24ビットDIBでは、色のRGB(赤・緑・青)成分をそれぞれ256(8ビット)段階で表現しています。この場合、RGBの各成分を同じ値にすると「鮮やかさ」が失われて灰色になるので、白黒に変換する時にはすべてのピクセルでRGBの値を同じにする事になるわけです。これは絵の「鮮やかさ」(各色の強さ)を無視して「明るさ」のみを表現する、という見方も出来るでしょう。逆に言えば、そのピクセルの明るさから見てRGBの各成分がどれだけばらついているかを調べれば、ピクセルの「鮮やかさ」が求められるという事にもなりそうです。さらに、RGBすべてを同じ値にするのではなくBだけを指定すれば「青黒」、Rだけなら「赤黒」になります。 明るさ=R×0.30+G×0.59+B×0.11 後は、この明るさの値をRGBすべてに指定すれば「白黒」、Rのみに指定してGBを0にすれば「青黒」になりますね。また、RGに明るさを指定してBを255にすると「白青」にもなるので試してみましょう。 ・プログラム今回は、DIBの読み込みプログラムを基に読み込んだDIBを白黒・白青に変換する処理を加えてみます。24ビットDIBでは、ビットマップバッファの先頭lpBMPから1ピクセル3バイトでRGB各成分が記録されているので、単色に変換する部分は、以下のような感じになるでしょう。
void grayScale(int mode) { // 単色スケールに変換
int i;
BYTE r,g,b,c;
for (i=0;i<xSize*ySize;i++) { // 各ピクセルを単色化
b=lpBMP[i*3]; // ピクセルのRGB成分を取得
g=lpBMP[i*3+1];
r=lpBMP[i*3+2];
c=(BYTE)(r*0.3+g*0.59+b*0.11); // 明るさを計算
if (mode==1) { // 白黒
lpBMP[i*3]=c;
lpBMP[i*3+1]=c;
lpBMP[i*3+2]=c;
} else if(mode==2) { // 白青
lpBMP[i*3]=255;
lpBMP[i*3+1]=c;
lpBMP[i*3+2]=c;
}
}
InvalidateRgn(hwnd,NULL,FALSE);
UpdateWindow (hwnd); // 再描画
}
プログラムを起動したら、フルカラーのビットマップファイルをドラッグ&ドロップするか、読み込みボタンで選択して読み込んでください。その後、白黒・白青ボタンで単色スケール化できます。ただし、このプログラムで単色化できるのは、24ビットかつ横方向が4ピクセル単位のDIBのみです。 |