フルカラーの24ビットDIBは、RGBそれぞれの色成分が1バイトずつ合計3バイト(24ビット)で1ピクセルを構成しています。RGB各成分は、ビットマップ上に規則正しく並んでいるので、RとBを「交換」したりRをBで「置換(置き換え)」する事も簡単に出来ますね。今回は、そのようなビットマップ内ピクセルの色成分の「置換」がどんな効果をもたらすのか試してみました。 DIBのRGB成分ビットマップの横幅がdwLengthバイトの24ビットDIBピクセル列lpBMPにおいて、ピクセル(x, y)のRGB成分は以下のように並んでいます。 B=lpBMP[x*3+dwLength*y]; G=lpBMP[x*3+dwLength*y+1]; R=lpBMP[x*3+dwLength*y+2]; このうち、RとBを交換するのであればlpBMP1[x*3+dwLength*y]とlpBMP1[x*3+dwLength*y+2]を交換すれば良いわけですね。ビットマップ全体を置換するには、この処理を全ピクセルに行います。 では、これを元にビットマップlpBMP1のRGBを任意に置換したlpBMP2を作成する関数を作ってみましょう。この関数は、引数に3つの整数を取りそれぞれ順にRGBをどの成分で置換するかを表す事にしました。例えば0がR,1がGが、Bが2を表す事にすると引数に(2,1,0)とすればRをB(2)で置換、GはG(1)でそのまま、BはR(0)で置換、という意味になります。 RGB置換関数#define R 0 #define G 1 #define B 2 void chngRGB(int red,int green,int blue) { DWORD i,j; BYTE r,g,b; for (i=0;i<dwHeight;i++) for (j=0;j<dwWidth;j++) { /* 元のRGB取得 */ b=lpBMP1[j*3+dwLength*i]; g=lpBMP1[j*3+dwLength*i+1]; r=lpBMP1[j*3+dwLength*i+2]; switch (red) { /* R成分 */ case R: /* Rで置換 */ lpBMP2[j*3+dwLength*i+2]=r; break; case G: /* Gで置換 */ lpBMP2[j*3+dwLength*i+2]=g; break; case B: /* Bで置換 */ lpBMP2[j*3+dwLength*i+2]=b; break; } switch (green) { /* G成分 */ case R: lpBMP2[j*3+dwLength*i+1]=r; break; case G: lpBMP2[j*3+dwLength*i+1]=g; break; case B: lpBMP2[j*3+dwLength*i+1]=b; break; } switch (blue) { /* B成分 */ case R: lpBMP2[j*3+dwLength*i]=r; break; case G: lpBMP2[j*3+dwLength*i]=g; break; case B: lpBMP2[j*3+dwLength*i]=b; break; } } } プログラムまず、24ビットフルカラービットマップファイルをウインドウにドロップして読み込んでください。次に、メニューでRGB成分を指定すると置換されます。指定は、左から順にRGB各成分をどの成分で置換するか、という形で行います。例えば「R=B」を指定するとR成分がB成分で置換されたビットマップを作成し表示するわけです。また、「乱数」ボタンではランダムに置換します。 試してみると、なかなか面白いですね。ネガのような感じ、セピア調、少し脱色したような感じ....と成分の置換方式によっていろいろな効果が出てきます。また、RGBすべてを同じ色の成分にすると「モノクロ」になりますが、この時どの成分で統一するかで感じが少し違ってくるようですね。 |