この配列の先頭アドレスはBITMAPINFO のbmiColorsなので256色のパレットをカラーテーブルに設定するには、以下のような処理をすれば良い事になります。 ・「パレット」をRGBQUAD[256] という配列に作る。 ・作成したパレットをbmiColors からのsizeof(RGBQUAD)*256 バイトに転送してDIBのカラーテーブルに設定する。 ・新たなカラーテーブルでDIBを画面に描画する。 カラーテーブルやパレットのRGBQUAD 構造体では、色の各成分を0ー255の256段階で指定するので、例えばグレースケール(黒ー白のグラデーション)のパレットを作成するには、 for (i=0;i<256;i++) { grayPal[i].rgbRed=i; // グレースケールパレット作成 grayPal[i].rgbGreen=i; grayPal[i].rgbBlue=i; } という感じになります。これで、grayPal[0]からgrayPalette[255] に256段階グレースケールのパレットが出来ました。後は、 CopyMemory(lpRGB,grayPal,sizeof(RGBQUAD)*256); として、このパレットをDIBのカラーテーブルに転送して再描画すれば良いだけです(lpRGB はカラーテーブルの先頭アドレス)。 ・プログラム今回のプログラムは、最初グレースケールが描かれたビットマップをカラーテーブルを変更する事で、赤や緑、青のグラデーションに変える例です。Gray、Red、Green、Blue の各ボタンをクリックするとビットマップの色が変わります。 ・ボタンクリックでカラーテーブルを変える処理 case WM_COMMAND: switch (LOWORD(wParam)) { case 0: // Grayボタン CopyMemory(lpRGB,grayPal,sizeof(RGBQUAD)*256); break; case 1: // Redボタン CopyMemory(lpRGB,redPal,sizeof(RGBQUAD)*256); break; case 2: // Greenボタン CopyMemory(lpRGB,greenPal,sizeof(RGBQUAD)*256); break; case 3: // Blueボタン CopyMemory(lpRGB,bluePal,sizeof(RGBQUAD)*256); break; } InvalidateRgn(hwnd,NULL,FALSE); UpdateWindow (hwnd); // 再描画 return 0; 起動したら、適当なbmpファイルを読み込んで、ボタンをクリックしてみてください。 |